X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Ffs%2Fbattfs_test.c;h=d1b808261a61865fde75cf629bf6e9c437272d13;hb=73574965a258a596b337df51732cd78c874798db;hp=5b5c4631fd5b0fc97cd22a4b143f8f5e2997892b;hpb=1f1d780c5ec0c233691a0059be2537c4cb862915;p=bertos.git diff --git a/bertos/fs/battfs_test.c b/bertos/fs/battfs_test.c index 5b5c4631..d1b80826 100644 --- a/bertos/fs/battfs_test.c +++ b/bertos/fs/battfs_test.c @@ -53,6 +53,7 @@ FILE *fp; const char test_filename[]="battfs_disk.bin"; +static uint8_t page_buffer[PAGE_SIZE]; static bool disk_open(struct BattFsSuper *d) { @@ -68,21 +69,46 @@ static bool disk_open(struct BattFsSuper *d) static size_t disk_page_read(struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, void *buf, size_t size) { - //TRACEMSG("page:%d, addr:%d, size:%d\n", page, addr, size); + //TRACEMSG("page:%d, addr:%d, size:%d", page, addr, size); fseek(fp, page * d->page_size + addr, SEEK_SET); return fread(buf, 1, size, fp); } -static size_t disk_page_write(struct BattFsSuper *d, pgcnt_t page, pgaddr_t addr, const void *buf, size_t size) +static size_t disk_buffer_write(struct BattFsSuper *d, pgaddr_t addr, const void *buf, size_t size) { - //TRACEMSG("page:%d, addr:%d, size:%d\n", page, addr, size); - fseek(fp, page * d->page_size + addr, SEEK_SET); - return fwrite(buf, 1, size, fp); + //TRACEMSG("addr:%d, size:%d", addr, size); + ASSERT(addr + size <= d->page_size); + memcpy(&page_buffer[addr], buf, size); + + return size; +} + +static size_t disk_buffer_read(struct BattFsSuper *d, pgaddr_t addr, void *buf, size_t size) +{ + //TRACEMSG("addr:%d, size:%d", addr, size); + ASSERT(addr + size <= d->page_size); + memcpy(buf, &page_buffer[addr], size); + + return size; +} + +static bool disk_page_load(struct BattFsSuper *d, pgcnt_t page) +{ + //TRACEMSG("page:%d", page); + fseek(fp, page * d->page_size, SEEK_SET); + return fread(page_buffer, 1, d->page_size, fp) == d->page_size; +} + +static bool disk_page_save(struct BattFsSuper *d, pgcnt_t page) +{ + //TRACEMSG("page:%d", page); + fseek(fp, page * d->page_size, SEEK_SET); + return fwrite(page_buffer, 1, d->page_size, fp) == d->page_size; } static bool disk_page_erase(struct BattFsSuper *d, pgcnt_t page) { - //TRACEMSG("page:%d\n", page); + //TRACEMSG("page:%d", page); fseek(fp, page * d->page_size, SEEK_SET); for (int i = 0; i < d->page_size; i++) @@ -140,7 +166,7 @@ static void test1(BattFsSuper *disk) fputc(0xff, fpt); fclose(fpt); for (int i = 0; i < PAGE_COUNT; i++) - ref[i] = PAGE_COUNT - i - 1; + ref[i] = i; testCheck(disk, ref); kprintf("Test1: passed\n"); @@ -156,7 +182,7 @@ static void test2(BattFsSuper *disk) for (int i = 0; i < PAGE_COUNT; i++) { - battfs_writeTestBlock(disk, i, 0, 0, 0, i, MARK_PAGE_VALID); + battfs_writeTestBlock(disk, i, 0, 0, 0, i); ref[i] = i; } fclose(fp); @@ -176,7 +202,7 @@ static void test3(BattFsSuper *disk) for (int i = 0; i < PAGE_COUNT / 2; i++) { - battfs_writeTestBlock(disk, i, 0, 0, 0, i, MARK_PAGE_VALID); + battfs_writeTestBlock(disk, i, 0, 0, 0, i); ref[i] = i; } fseek(fp, FILE_SIZE / 2, SEEK_SET); @@ -186,7 +212,7 @@ static void test3(BattFsSuper *disk) for (int i = PAGE_COUNT / 2; i < PAGE_COUNT; i++) { - ref[i] = PAGE_COUNT + PAGE_COUNT / 2 - i - 1; + ref[i] = i; } @@ -194,6 +220,7 @@ static void test3(BattFsSuper *disk) kprintf("Test3: passed\n"); } +#if 0 static void test4(BattFsSuper *disk) { pgcnt_t ref[PAGE_COUNT]; @@ -204,12 +231,12 @@ static void test4(BattFsSuper *disk) for (int i = 0; i < PAGE_COUNT / 2; i++) { - battfs_writeTestBlock(disk, i, 0, 0, 0, i, MARK_PAGE_VALID); + battfs_writeTestBlock(disk, i, 0, 0, 0, i); ref[i] = i; } for (int i = PAGE_COUNT / 2; i < PAGE_COUNT; i++) { - battfs_writeTestBlock(disk, i, 0, 0, 0, i, i); + battfs_writeTestBlock(disk, i, 0, 0, 0, i); ref[i] = i; } fclose(fp); @@ -232,12 +259,12 @@ static void test5(BattFsSuper *disk) for (int i = 0; i < PAGE_COUNT / 3; i++) { - battfs_writeTestBlock(disk, i, 0, 0, 0, i, MARK_PAGE_VALID); + battfs_writeTestBlock(disk, i, 0, 0, 0, i); ref[i] = i; } for (int i = PAGE_COUNT / 3; i < 2 * (PAGE_COUNT / 3); i++) { - battfs_writeTestBlock(disk, i, 0, 0, 0, i, i); + battfs_writeTestBlock(disk, i, 0, 0, 0, i); ref[i + PAGE_COUNT / 3 + 1] = i; } fclose(fp); @@ -248,6 +275,7 @@ static void test5(BattFsSuper *disk) testCheck(disk, ref); kprintf("Test5: passed\n"); } +#endif static void test6(BattFsSuper *disk) { @@ -256,17 +284,18 @@ static void test6(BattFsSuper *disk) fp = fopen(test_filename, "w+"); + // page, inode, seq, fill, pgoff + battfs_writeTestBlock(disk, 0, 0, 0, 0, 0); + battfs_writeTestBlock(disk, 1, 0, 0, 0, 1); + battfs_writeTestBlock(disk, 2, 0, 1, 0, 1); + disk->erase(disk, 3); - battfs_writeTestBlock(disk, 0, 0, 0, 0, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 1, 0, 0, 0, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 2, 0, 1, 0, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 3, 0, 0, 0, 0, 123); fclose(fp); ref[0] = 0; ref[1] = 2; - ref[2] = 3; - ref[3] = 1; + ref[2] = 1; + ref[3] = 3; testCheck(disk, ref); kprintf("Test6: passed\n"); @@ -279,17 +308,17 @@ static void test7(BattFsSuper *disk) fp = fopen(test_filename, "w+"); - - battfs_writeTestBlock(disk, 0, 0, 0, 0, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 1, 0, 1, 0, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 2, 0, 0, 0, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 3, 0, 0, 0, 0, 123); + // page, inode, seq, fill, pgoff + battfs_writeTestBlock(disk, 0, 0, 0, 0, 0); + battfs_writeTestBlock(disk, 1, 0, 1, 0, 1); + battfs_writeTestBlock(disk, 2, 0, 0, 0, 1); + disk->erase(disk, 3); fclose(fp); ref[0] = 0; ref[1] = 1; - ref[2] = 3; - ref[3] = 2; + ref[2] = 2; + ref[3] = 3; testCheck(disk, ref); kprintf("Test7: passed\n"); @@ -303,10 +332,11 @@ static void test8(BattFsSuper *disk) fp = fopen(test_filename, "w+"); - battfs_writeTestBlock(disk, 0, 0, 0, 0, 0, 1235); - battfs_writeTestBlock(disk, 1, 0, 0, 0, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 2, 0, 1, 0, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 3, 0, 0, 0, 1, MARK_PAGE_VALID); + // page, inode, seq, fill, pgoff + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, 0, 0, 0, 0); + battfs_writeTestBlock(disk, 2, 0, 1, 0, 1); + battfs_writeTestBlock(disk, 3, 0, 0, 0, 1); fclose(fp); @@ -327,24 +357,25 @@ static void test9(BattFsSuper *disk) fp = fopen(test_filename, "w+"); - battfs_writeTestBlock(disk, 0, 0, 0, 0, 0, 1235); - battfs_writeTestBlock(disk, 1, 0, 0, 0, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 2, 0, 3, 0, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 3, 0, 0, 0, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 4, 0, 0, 0, 0, 1236); - battfs_writeTestBlock(disk, 5, 4, 0, 0, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 6, 4, 1, 0, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 7, 4, 0, 0, 1, MARK_PAGE_VALID); + // page, inode, seq, fill, pgoff + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, 0, 0, 0, 0); + battfs_writeTestBlock(disk, 2, 0, 3, 0, 1); + battfs_writeTestBlock(disk, 3, 0, 0, 0, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, 4, 0, 0, 0); + battfs_writeTestBlock(disk, 6, 4, 1, 0, 1); + battfs_writeTestBlock(disk, 7, 4, 0, 0, 1); fclose(fp); ref[0] = 1; - ref[1] = 3; + ref[1] = 2; ref[2] = 5; ref[3] = 6; ref[4] = 0; - ref[5] = 4; - ref[6] = 2; + ref[5] = 3; + ref[6] = 4; ref[7] = 7; testCheck(disk, ref); @@ -353,26 +384,27 @@ static void test9(BattFsSuper *disk) static void test10(BattFsSuper *disk) { - BattFS fd1; - BattFS fd2; + BattFs fd1; + BattFs fd2; kprintf("Test10: open file test, inode 0 and inode 4\n"); fp = fopen(test_filename, "w+"); - unsigned int PAGE_FILL = 116; + int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; unsigned int INODE = 0; unsigned int INODE2 = 4; unsigned int INEXISTENT_INODE = 123; unsigned int MODE = 0; - battfs_writeTestBlock(disk, 0, 123, 0, PAGE_FILL, 0, 1235); - battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 4, INODE2, 0, PAGE_FILL, 0, 1236); - battfs_writeTestBlock(disk, 5, INODE2, 0, PAGE_FILL, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 6, INODE2, 1, PAGE_FILL, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 7, INODE2, 0, PAGE_FILL, 1, MARK_PAGE_VALID); + // page, inode, seq, fill, pgoff + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 7, INODE2, 0, PAGE_FILL, 1); fclose(fp); @@ -418,26 +450,26 @@ static void test10(BattFsSuper *disk) static void test11(BattFsSuper *disk) { - BattFS fd1; + BattFs fd1; uint8_t buf[16]; kprintf("Test11: read file test\n"); fp = fopen(test_filename, "w+"); - unsigned int PAGE_FILL = 116; + unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; unsigned int INODE = 0; unsigned int INODE2 = 4; unsigned int MODE = 0; - battfs_writeTestBlock(disk, 0, 123, 0, PAGE_FILL, 0, 1235); - battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 4, INODE2, 0, PAGE_FILL, 0, 1236); - battfs_writeTestBlock(disk, 5, INODE2, 0, PAGE_FILL, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 6, INODE2, 1, PAGE_FILL, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 7, INODE2, 0, PAGE_FILL, 1, MARK_PAGE_VALID); + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 7, INODE2, 0, PAGE_FILL, 1); fclose(fp); @@ -446,7 +478,7 @@ static void test11(BattFsSuper *disk) ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); ASSERT(fd1.fd.seek_pos == sizeof(buf)); for (size_t i = 0; i < sizeof(buf); i++) - ASSERT(buf[i] == 0); + ASSERT(buf[i] == 0xff); ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(battfs_close(disk)); @@ -456,25 +488,25 @@ static void test11(BattFsSuper *disk) static void test12(BattFsSuper *disk) { - BattFS fd1; + BattFs fd1; kprintf("Test12: read file test across page boundary and seek test\n"); fp = fopen(test_filename, "w+"); - const unsigned int PAGE_FILL = 116; + const unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; unsigned int INODE = 0; unsigned int MODE = 0; - uint8_t buf[PAGE_FILL + 10]; + uint8_t buf[PAGE_FILL + BATTFS_HEADER_LEN / 2]; - battfs_writeTestBlock(disk, 0, 123, 0, PAGE_FILL, 0, 1235); - battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 4, INODE, 0, PAGE_FILL, 0, 1236); - battfs_writeTestBlock(disk, 5, INODE, 0, PAGE_FILL, 2, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 6, INODE, 1, PAGE_FILL, 3, MARK_PAGE_VALID); - battfs_writeTestBlock(disk, 7, INODE, 0, PAGE_FILL, 3, MARK_PAGE_VALID); + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE, 0, PAGE_FILL, 2); + battfs_writeTestBlock(disk, 6, INODE, 1, PAGE_FILL, 3); + battfs_writeTestBlock(disk, 7, INODE, 0, PAGE_FILL, 3); fclose(fp); @@ -484,22 +516,22 @@ static void test12(BattFsSuper *disk) ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf)); for (size_t i = 0; i < sizeof(buf); i++) - ASSERT(buf[i] == 0); + ASSERT(buf[i] == 0xff); ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 2); for (size_t i = 0; i < sizeof(buf); i++) - ASSERT(buf[i] == 0); + ASSERT(buf[i] == 0xff); ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 3); for (size_t i = 0; i < sizeof(buf); i++) - ASSERT(buf[i] == 0); + ASSERT(buf[i] == 0xff); - ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == 86); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == PAGE_FILL * 4 - sizeof(buf) * 3); ASSERT(fd1.fd.seek_pos == (kfile_off_t)fd1.fd.size); - for (size_t i = 0; i < 86; i++) - ASSERT(buf[i] == 0); + for (size_t i = 0; i < PAGE_FILL * 4 - sizeof(buf) * 3; i++) + ASSERT(buf[i] == 0xff); ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); ASSERT(fd1.fd.seek_pos == 0); @@ -514,20 +546,236 @@ static void test12(BattFsSuper *disk) } +static void test13(BattFsSuper *disk) +{ + BattFs fd1; + uint8_t buf[PAGE_SIZE - BATTFS_HEADER_LEN]; + + kprintf("Test13: write file test\n"); + + fp = fopen(test_filename, "w+"); + + unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + unsigned int INODE = 0; + unsigned int INODE2 = 4; + unsigned int MODE = 0; + + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 7, INODE2, 0, PAGE_FILL, 1); + + fclose(fp); + + for (size_t i = 0; i < sizeof(buf); i++) + buf[i] = i; + + ASSERT(battfs_init(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)); + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + ASSERT(fd1.fd.seek_pos == 0); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == i); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_close(disk)); + + kprintf("Test13: passed\n"); +} + +static void test14(BattFsSuper *disk) +{ + BattFs fd1; + + kprintf("Test14: write file test across page boundary and seek test\n"); + + fp = fopen(test_filename, "w+"); + + const unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + unsigned int INODE = 0; + unsigned int MODE = 0; + uint8_t buf[PAGE_FILL + BATTFS_HEADER_LEN / 2]; + + disk->erase(disk, 0); + battfs_writeTestBlock(disk, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(disk, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(disk, 3, INODE, 0, PAGE_FILL, 1); + disk->erase(disk, 4); + battfs_writeTestBlock(disk, 5, INODE, 0, PAGE_FILL, 2); + battfs_writeTestBlock(disk, 6, INODE, 1, PAGE_FILL, 3); + battfs_writeTestBlock(disk, 7, INODE, 0, PAGE_FILL, 3); + + fclose(fp); + + ASSERT(battfs_init(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + + uint8_t val = 0; + for (size_t i = 0; i < sizeof(buf); i++) + buf[i] = val++; + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf)); + + for (size_t i = 0; i < sizeof(buf); i++) + buf[i] = val++; + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 2); + + for (size_t i = 0; i < sizeof(buf); i++) + buf[i] = val++; + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 3); + + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + ASSERT(fd1.fd.seek_pos == 0); + val = 0; + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == val++); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == val++); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (size_t i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == val++); + + ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 3); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_close(disk)); + + kprintf("Test14: passed\n"); +} + +static void test15(BattFsSuper *disk) +{ + kprintf("Test15: file creation on new disk\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fpt); + fclose(fpt); + + BattFs fd1; + unsigned int INODE = 0; + unsigned int MODE = BATTFS_CREATE; + + ASSERT(battfs_init(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + for (int i = 0; i < FILE_SIZE / 2; i++) + ASSERT(kfile_putc(i, &fd1.fd) != EOF); + + ASSERT(fd1.fd.seek_pos == FILE_SIZE / 2); + ASSERT(fd1.fd.size == FILE_SIZE / 2); + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_close(disk)); + + ASSERT(battfs_init(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, 0)); + ASSERT(fd1.fd.size == FILE_SIZE / 2); + ASSERT(fd1.fd.seek_pos == 0); + + uint8_t buf[FILE_SIZE / 2]; + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, FILE_SIZE / 2) == FILE_SIZE / 2); + + for (int i = 0; i < FILE_SIZE / 2; i++) + ASSERT(buf[i] == (i & 0xff)); + + ASSERT(fd1.fd.seek_pos == FILE_SIZE / 2); + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_close(disk)); + + + kprintf("Test15: passed\n"); +} + +static void test16(BattFsSuper *disk) +{ + kprintf("Test16: multiple write on file\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fpt); + fclose(fpt); + + BattFs fd1; + unsigned int INODE = 0; + unsigned int MODE = BATTFS_CREATE; + uint8_t buf[1000]; + + ASSERT(battfs_init(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + + int j; + for (j = 1; j < 1013; j++) + { + for (int i = 0; i < sizeof(buf); i++) + buf[i] = j+i; + + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == sizeof(buf)); + ASSERT(fd1.fd.size == sizeof(buf)); + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == sizeof(buf)); + for (int i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == ((j+i) & 0xff)); + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + ASSERT(disk->free_bytes == disk->disk_size - sizeof(buf)); + } + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_close(disk)); + + ASSERT(battfs_init(disk)); + ASSERT(disk->free_bytes == disk->disk_size - sizeof(buf)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, 0)); + ASSERT(fd1.fd.size == sizeof(buf)); + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (int i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == ((j-1+i) & 0xff)); + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_close(disk)); + + kprintf("Test16: passed\n"); +} + int battfs_testRun(void) { BattFsSuper disk; disk.open = disk_open; disk.read = disk_page_read; - disk.write = disk_page_write; + disk.load = disk_page_load; + disk.bufferWrite = disk_buffer_write; + disk.bufferRead = disk_buffer_read; + disk.save = disk_page_save; disk.erase = disk_page_erase; disk.close = disk_close; test1(&disk); test2(&disk); test3(&disk); - test4(&disk); - test5(&disk); + //test4(&disk); + //test5(&disk); test6(&disk); test7(&disk); test8(&disk); @@ -535,6 +783,10 @@ int battfs_testRun(void) test10(&disk); test11(&disk); test12(&disk); + test13(&disk); + test14(&disk); + test15(&disk); + test16(&disk); kprintf("All tests passed!\n"); return 0;