X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Ffs%2Fbattfs_test.c;h=e3996cab78a21894c35149c6ff486937229ce41f;hb=500fbef0b281c79719c73ba1a818db54057f74b7;hp=0580495feff209f39a5b522332bec16c5e7b5bd7;hpb=802cec6861e5f1988f23085b2a6849d86368628c;p=bertos.git diff --git a/bertos/fs/battfs_test.c b/bertos/fs/battfs_test.c index 0580495f..e3996cab 100644 --- a/bertos/fs/battfs_test.c +++ b/bertos/fs/battfs_test.c @@ -69,35 +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_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); + //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++) @@ -115,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++) { @@ -137,17 +149,18 @@ static void testCheck(BattFsSuper *disk, pgcnt_t *reference) kprintf("%04d ", reference[i]); } kputchar('\n'); - battfs_close(disk); + battfs_umount(disk); exit(2); } } - battfs_close(disk); + ASSERT(battfs_fsck(disk)); + battfs_umount(disk); } -static void test1(BattFsSuper *disk) +static void diskNew(BattFsSuper *disk) { pgcnt_t ref[PAGE_COUNT]; - kprintf("Test1: disk new\n"); + TRACEMSG("1: disk new\n"); FILE *fpt = fopen(test_filename, "w+"); @@ -158,40 +171,40 @@ static void test1(BattFsSuper *disk) ref[i] = i; testCheck(disk, ref); - kprintf("Test1: passed\n"); + TRACEMSG("1: passed\n"); } -static void test2(BattFsSuper *disk) +static void disk1File(BattFsSuper *disk) { pgcnt_t ref[PAGE_COUNT]; - kprintf("Test2: disk full with 1 contiguos file\n"); + TRACEMSG("2: disk full with 1 contiguos file\n"); fp = fopen(test_filename, "w+"); for (int i = 0; i < PAGE_COUNT; i++) { - battfs_writeTestBlock(disk, i, 0, 0, 0, i); + battfs_writeTestBlock(disk, i, 0, 0, disk->data_size, i); ref[i] = i; } fclose(fp); testCheck(disk, ref); - kprintf("Test2: passed\n"); + TRACEMSG("2: passed\n"); } -static void test3(BattFsSuper *disk) +static void diskHalfFile(BattFsSuper *disk) { pgcnt_t ref[PAGE_COUNT]; - kprintf("Test3: disk half full with 1 contiguos file, rest unformatted\n"); + TRACEMSG("3: disk half full with 1 contiguos file, rest unformatted\n"); fp = fopen(test_filename, "w+"); for (int i = 0; i < PAGE_COUNT / 2; i++) { - battfs_writeTestBlock(disk, i, 0, 0, 0, i); + battfs_writeTestBlock(disk, i, 0, 0, disk->data_size, i); ref[i] = i; } fseek(fp, FILE_SIZE / 2, SEEK_SET); @@ -206,77 +219,21 @@ static void test3(BattFsSuper *disk) testCheck(disk, ref); - kprintf("Test3: passed\n"); + TRACEMSG("3: passed\n"); } -#if 0 -static void test4(BattFsSuper *disk) -{ - pgcnt_t ref[PAGE_COUNT]; - kprintf("Test4: disk half full with 1 contiguos file, rest marked free\n"); - - - fp = fopen(test_filename, "w+"); - for (int i = 0; i < PAGE_COUNT / 2; i++) - { - 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); - ref[i] = i; - } - fclose(fp); - - - testCheck(disk, ref); - kprintf("Test4: passed\n"); -} - -static void test5(BattFsSuper *disk) -{ - pgcnt_t ref[PAGE_COUNT]; - kprintf("Test5: disk 1/3 full with 1 contiguos file, 1/3 marked free, rest unformatted\n"); - - - fp = fopen(test_filename, "w+"); - - for (int i = 0; i < FILE_SIZE; i++) - fputc(0xff, fp); - - for (int i = 0; i < PAGE_COUNT / 3; i++) - { - 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); - ref[i + PAGE_COUNT / 3 + 1] = i; - } - fclose(fp); - - for (int i = PAGE_COUNT / 3; i < 2 * (PAGE_COUNT / 3) + 1; i++) - ref[i] = PAGE_COUNT + PAGE_COUNT / 3 - i - 1; - - testCheck(disk, ref); - kprintf("Test5: passed\n"); -} -#endif - -static void test6(BattFsSuper *disk) +static void oldSeq1(BattFsSuper *disk) { pgcnt_t ref[4]; - kprintf("Test6: 1 file with 1 old seq num, 1 free block\n"); + TRACEMSG("6: 1 file with 1 old seq num, 1 free block\n"); 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); + battfs_writeTestBlock(disk, 0, 0, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 1, 0, 0, disk->data_size, 1); + battfs_writeTestBlock(disk, 2, 0, 1, disk->data_size, 1); disk->erase(disk, 3); @@ -287,20 +244,20 @@ static void test6(BattFsSuper *disk) ref[3] = 3; testCheck(disk, ref); - kprintf("Test6: passed\n"); + TRACEMSG("6: passed\n"); } -static void test7(BattFsSuper *disk) +static void oldSeq2(BattFsSuper *disk) { pgcnt_t ref[4]; - kprintf("Test7: 1 file with 1 old seq num, 1 free block\n"); + TRACEMSG("7: 1 file with 1 old seq num, 1 free block\n"); fp = fopen(test_filename, "w+"); // 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); + battfs_writeTestBlock(disk, 0, 0, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 1, 0, 1, disk->data_size, 1); + battfs_writeTestBlock(disk, 2, 0, 0, disk->data_size, 1); disk->erase(disk, 3); fclose(fp); @@ -310,22 +267,22 @@ static void test7(BattFsSuper *disk) ref[3] = 3; testCheck(disk, ref); - kprintf("Test7: passed\n"); + TRACEMSG("7: passed\n"); } -static void test8(BattFsSuper *disk) +static void oldSeq3(BattFsSuper *disk) { pgcnt_t ref[4]; - kprintf("Test8: 1 file with 1 old seq num, 1 free block\n"); + TRACEMSG("8: 1 file with 1 old seq num, 1 free block\n"); fp = fopen(test_filename, "w+"); // 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); + battfs_writeTestBlock(disk, 1, 0, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 2, 0, 1, disk->data_size, 1); + battfs_writeTestBlock(disk, 3, 0, 0, disk->data_size, 1); fclose(fp); @@ -335,26 +292,26 @@ static void test8(BattFsSuper *disk) ref[3] = 3; testCheck(disk, ref); - kprintf("Test8: passed\n"); + TRACEMSG("8: passed\n"); } -static void test9(BattFsSuper *disk) +static void oldSeq2File(BattFsSuper *disk) { pgcnt_t ref[8]; - kprintf("Test9: 2 file with old seq num, 2 free block\n"); + TRACEMSG("9: 2 file with old seq num, 2 free block\n"); fp = fopen(test_filename, "w+"); // 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); + battfs_writeTestBlock(disk, 1, 0, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 2, 0, 3, disk->data_size, 1); + battfs_writeTestBlock(disk, 3, 0, 0, disk->data_size, 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); + battfs_writeTestBlock(disk, 5, 4, 0, disk->data_size, 0); + battfs_writeTestBlock(disk, 6, 4, 1, disk->data_size, 1); + battfs_writeTestBlock(disk, 7, 4, 0, disk->data_size, 1); fclose(fp); @@ -368,21 +325,21 @@ static void test9(BattFsSuper *disk) ref[7] = 7; testCheck(disk, ref); - kprintf("Test9: passed\n"); + TRACEMSG("9: passed\n"); } -static void test10(BattFsSuper *disk) +static void openFile(BattFsSuper *disk) { BattFs fd1; BattFs fd2; - kprintf("Test10: open file test, inode 0 and inode 4\n"); + TRACEMSG("10: open file test, inode 0 and inode 4\n"); fp = fopen(test_filename, "w+"); int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; - unsigned int INODE = 0; - unsigned int INODE2 = 4; - unsigned int INEXISTENT_INODE = 123; + inode_t INODE = 0; + inode_t INODE2 = 4; + inode_t INEXISTENT_INODE = 123; unsigned int MODE = 0; // page, inode, seq, fill, pgoff @@ -397,7 +354,8 @@ static void test10(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)); @@ -432,23 +390,24 @@ static void test10(BattFsSuper *disk) ASSERT(kfile_close(&fd1.fd) == 0); ASSERT(kfile_close(&fd2.fd) == 0); ASSERT(LIST_EMPTY(&disk->file_opened_list)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); - kprintf("Test10: passed\n"); + TRACEMSG("10: passed\n"); } -static void test11(BattFsSuper *disk) +static void readFile(BattFsSuper *disk) { BattFs fd1; uint8_t buf[16]; - kprintf("Test11: read file test\n"); + TRACEMSG("11: read 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; + inode_t INODE = 0; + inode_t INODE2 = 4; unsigned int MODE = 0; disk->erase(disk, 0); @@ -462,29 +421,31 @@ static void test11(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)); 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)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); - kprintf("Test11: passed\n"); + TRACEMSG("11: passed\n"); } -static void test12(BattFsSuper *disk) +static void readAcross(BattFsSuper *disk) { BattFs fd1; - kprintf("Test12: read file test across page boundary and seek test\n"); + TRACEMSG("12: read 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; + inode_t INODE = 0; unsigned int MODE = 0; uint8_t buf[PAGE_FILL + BATTFS_HEADER_LEN / 2]; @@ -499,28 +460,29 @@ static void test12(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 == (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)) == PAGE_FILL * 4 - sizeof(buf) * 3); ASSERT(fd1.fd.seek_pos == (kfile_off_t)fd1.fd.size); for (size_t i = 0; i < PAGE_FILL * 4 - sizeof(buf) * 3; i++) - ASSERT(buf[i] == 0); + ASSERT(buf[i] == 0xff); ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); ASSERT(fd1.fd.seek_pos == 0); @@ -529,9 +491,513 @@ static void test12(BattFsSuper *disk) ASSERT(fd1.fd.seek_pos = (kfile_off_t)fd1.fd.size); ASSERT(kfile_close(&fd1.fd) == 0); - ASSERT(battfs_close(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("12: passed\n"); +} + + +static void writeFile(BattFsSuper *disk) +{ + BattFs fd1; + uint8_t buf[PAGE_SIZE - BATTFS_HEADER_LEN]; + + TRACEMSG("13: write file test\n"); + + fp = fopen(test_filename, "w+"); + + unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + inode_t 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_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)); + 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_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("13: passed\n"); +} + +static void writeAcross(BattFsSuper *disk) +{ + BattFs fd1; + + TRACEMSG("14: 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; + inode_t 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_mount(disk)); + ASSERT(battfs_fsck(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_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("14: passed\n"); +} + +static void createFile(BattFsSuper *disk) +{ + TRACEMSG("15: 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; + inode_t INODE = 0; + unsigned int MODE = BATTFS_CREATE; + + 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); + + ASSERT(fd1.fd.seek_pos == FILE_SIZE / 2); + ASSERT(fd1.fd.size == FILE_SIZE / 2); + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(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); + + 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_fsck(disk)); + ASSERT(battfs_umount(disk)); + + + TRACEMSG("15: passed\n"); +} + +static void multipleWrite(BattFsSuper *disk) +{ + TRACEMSG("16: 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; + inode_t INODE = 0; + unsigned int MODE = BATTFS_CREATE; + uint8_t buf[1000]; + + ASSERT(battfs_mount(disk)); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); + + int j; + for (j = 1; j < 1013; j++) + { + for (unsigned 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 (unsigned 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_fsck(disk)); + ASSERT(battfs_umount(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)); + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == ((j-1+i) & 0xff)); + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + + TRACEMSG("16: passed\n"); +} + +static void increaseFile(BattFsSuper *disk) +{ + TRACEMSG("17: increasing dimension of a file with multiple open files.\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE / 10; i++) + fputc(0xff, fpt); + fclose(fpt); + + BattFs fd1,fd2; + inode_t INODE1 = 1, INODE2 = 2; + unsigned int MODE = BATTFS_CREATE; + uint8_t buf[1000]; + + 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++) + ASSERT(kfile_putc(i, &fd2.fd) != EOF); + ASSERT(kfile_seek(&fd2.fd, 0, KSM_SEEK_SET) == 0); + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd2.fd, buf, sizeof(buf)) == sizeof(buf)); + + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == (i & 0xff)); + ASSERT(kfile_seek(&fd2.fd, 0, KSM_SEEK_SET) == 0); + + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(kfile_putc(i, &fd1.fd) != EOF); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd2.fd, buf, sizeof(buf)) == sizeof(buf)); + + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == (i & 0xff)); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_close(&fd2.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("17: passed\n"); +} + +static void readEOF(BattFsSuper *disk) +{ + BattFs fd1; + uint8_t buf[16]; + + TRACEMSG("18: reading over EOF test\n"); + + fp = fopen(test_filename, "w+"); + + unsigned int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; + inode_t INODE = 0; + inode_t 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); + + 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); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == 0); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("18: passed\n"); +} + +static void writeEOF(BattFsSuper *disk) +{ + TRACEMSG("19: writing over EOF test\n"); + + FILE *fpt = fopen(test_filename, "w+"); + + for (int i = 0; i < FILE_SIZE / 5; i++) + fputc(0xff, fpt); + fclose(fpt); + + BattFs fd1; + inode_t INODE = 0; + unsigned int MODE = BATTFS_CREATE; + uint8_t buf[FILE_SIZE / 13]; + + for (int i = 0; i < 2; i++) + buf[i] = i; + + 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); + + ASSERT(kfile_seek(&fd1.fd, 2, KSM_SEEK_END) == 2); + ASSERT(kfile_write(&fd1.fd, buf, 2)); + ASSERT(fd1.fd.seek_pos == 4); + ASSERT(fd1.fd.size == 4); + ASSERT(disk->free_bytes == prev_free - 4); + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + memset(buf, 0, 2); + ASSERT(kfile_read(&fd1.fd, buf, 2) == 2); + for (int i = 0; i < 2; i++) + ASSERT(buf[i] == 0); + + memset(buf, 0, 2); + ASSERT(kfile_read(&fd1.fd, buf, 2) == 2); + for (int i = 0; i < 2; i++) + ASSERT(buf[i] == (i & 0xff)); + + ASSERT(kfile_seek(&fd1.fd, sizeof(buf), KSM_SEEK_END) == sizeof(buf) + 4); + for (unsigned i = 0; i < sizeof(buf); i++) + buf[i] = i; + ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf))); + ASSERT(fd1.fd.seek_pos == sizeof(buf) * 2 + 4); + ASSERT(fd1.fd.size == sizeof(buf) * 2 + 4); + ASSERT(disk->free_bytes == prev_free - sizeof(buf) * 2 - 4); + + ASSERT(kfile_seek(&fd1.fd, 0, KSM_SEEK_SET) == 0); + + memset(buf, 0, 2); + ASSERT(kfile_read(&fd1.fd, buf, 2) == 2); + ASSERT(fd1.fd.seek_pos == 2); + for (int i = 0; i < 2; i++) + ASSERT(buf[i] == 0); + + memset(buf, 0, 2); + ASSERT(kfile_read(&fd1.fd, buf, 2) == 2); + ASSERT(fd1.fd.seek_pos == 4); + for (int i = 0; i < 2; i++) + ASSERT(buf[i] == (i & 0xff)); + + memset(buf, 0, 4); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + ASSERT(fd1.fd.seek_pos == sizeof(buf) + 4); + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == 0); + + memset(buf, 0, sizeof(buf)); + ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); + for (unsigned i = 0; i < sizeof(buf); i++) + ASSERT(buf[i] == (i & 0xff)); + + ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + TRACEMSG("19: passed\n"); - kprintf("Test12: 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"); } @@ -539,25 +1005,36 @@ 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; 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); - test6(&disk); - test7(&disk); - test8(&disk); - test9(&disk); - test10(&disk); - test11(&disk); - test12(&disk); + + diskNew(&disk); + disk1File(&disk); + diskHalfFile(&disk); + oldSeq1(&disk); + oldSeq2(&disk); + oldSeq3(&disk); + oldSeq2File(&disk); + openFile(&disk); + readFile(&disk); + readAcross(&disk); + writeFile(&disk); + writeAcross(&disk); + createFile(&disk); + multipleWrite(&disk); + increaseFile(&disk); + readEOF(&disk); + writeEOF(&disk); + endOfSpace(&disk); + multipleFilesRW(&disk); + kprintf("All tests passed!\n"); return 0;