X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Ffs%2Fbattfs_test.c;h=33b1f69fe5fd303d494675a0891a36f5a3bed41d;hb=706954ecdc8313eb3dd0a23190ae9d12cd4392a3;hp=019ee48822066b01a45fa48a1bb7e6cedb0c18dc;hpb=16c15fc5d915f4d55006d5bb70ae04870dad8f05;p=bertos.git diff --git a/bertos/fs/battfs_test.c b/bertos/fs/battfs_test.c index 019ee488..33b1f69f 100644 --- a/bertos/fs/battfs_test.c +++ b/bertos/fs/battfs_test.c @@ -36,6 +36,7 @@ */ #include +#include #include #include @@ -46,87 +47,19 @@ #define FILE_SIZE 32768 #define PAGE_SIZE 128 -#define PAGE_COUNT FILE_SIZE / PAGE_SIZE + +#define DATA_SIZE (PAGE_SIZE - BATTFS_HEADER_LEN) +#define PAGE_COUNT (FILE_SIZE / PAGE_SIZE) #if UNIT_TEST -FILE *fp; const char test_filename[]="battfs_disk.bin"; static uint8_t page_buffer[PAGE_SIZE]; - -static bool disk_open(struct BattFsSuper *d) -{ - fp = fopen(test_filename, "r+b"); - ASSERT(fp); - fseek(fp, 0, SEEK_END); - d->page_size = PAGE_SIZE; - d->page_count = ftell(fp) / d->page_size; - d->page_array = malloc(d->page_count * sizeof(pgcnt_t)); - //TRACEMSG("page_size:%d, page_count:%d\n", d->page_size, d->page_count); - return (fp && d->page_array); -} - -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", 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("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", page); - fseek(fp, page * d->page_size, SEEK_SET); - - for (int i = 0; i < d->page_size; i++) - if (fputc(0xff, fp) == EOF) - return false; - return true; -} - -static bool disk_close(struct BattFsSuper *d) -{ - //TRACE; - free(d->page_array); - return (fclose(fp) != EOF); -} +static pgcnt_t page_array[PAGE_COUNT]; static void testCheck(BattFsSuper *disk, pgcnt_t *reference) { - ASSERT(battfs_init(disk)); ASSERT(battfs_fsck(disk)); for (int i = 0; i < disk->page_count; i++) @@ -149,27 +82,33 @@ 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); + ASSERT(battfs_umount(disk)); } static void diskNew(BattFsSuper *disk) { pgcnt_t ref[PAGE_COUNT]; + TRACEMSG("1: disk new\n"); FILE *fpt = fopen(test_filename, "w+"); for (int i = 0; i < FILE_SIZE; i++) fputc(0xff, fpt); - fclose(fpt); + for (int i = 0; i < PAGE_COUNT; i++) ref[i] = i; + KBlockFile f; + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT); + battfs_mount(disk, &f.b, page_array, sizeof(page_array)); + testCheck(disk, ref); TRACEMSG("1: passed\n"); } @@ -179,15 +118,20 @@ static void disk1File(BattFsSuper *disk) pgcnt_t ref[PAGE_COUNT]; TRACEMSG("2: disk full with 1 contiguos file\n"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fp); - fp = fopen(test_filename, "w+"); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, PAGE_COUNT); for (int i = 0; i < PAGE_COUNT; i++) { - battfs_writeTestBlock(disk, i, 0, 0, disk->data_size, i); + battfs_writeTestBlock(&f.b, i, 0, 0, DATA_SIZE, i); ref[i] = i; } - fclose(fp); + + battfs_mount(disk, &f.b, page_array, sizeof(page_array)); testCheck(disk, ref); TRACEMSG("2: passed\n"); @@ -200,23 +144,28 @@ static void diskHalfFile(BattFsSuper *disk) TRACEMSG("3: disk half full with 1 contiguos file, rest unformatted\n"); - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fp); + + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, PAGE_COUNT); for (int i = 0; i < PAGE_COUNT / 2; i++) { - battfs_writeTestBlock(disk, i, 0, 0, disk->data_size, i); + battfs_writeTestBlock(&f.b, i, 0, 0, DATA_SIZE, i); ref[i] = i; } fseek(fp, FILE_SIZE / 2, SEEK_SET); for (int i = FILE_SIZE / 2; i < FILE_SIZE; i++) fputc(0xff, fp); - fclose(fp); for (int i = PAGE_COUNT / 2; i < PAGE_COUNT; i++) { ref[i] = i; } + battfs_mount(disk, &f.b, page_array, sizeof(page_array)); testCheck(disk, ref); TRACEMSG("3: passed\n"); @@ -228,21 +177,25 @@ static void oldSeq1(BattFsSuper *disk) pgcnt_t ref[4]; TRACEMSG("6: 1 file with 1 old seq num, 1 free block\n"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 4; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 4); - fp = fopen(test_filename, "w+"); // page, inode, seq, fill, pgoff - 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); + battfs_writeTestBlock(&f.b, 0, 0, 0, DATA_SIZE, 0); + battfs_writeTestBlock(&f.b, 1, 0, 0, DATA_SIZE, 1); + battfs_writeTestBlock(&f.b, 2, 0, 1, DATA_SIZE, 1); + battfs_eraseBlock(&f.b, 3); - - fclose(fp); ref[0] = 0; ref[1] = 2; ref[2] = 1; ref[3] = 3; + battfs_mount(disk, &f.b, page_array, sizeof(page_array)); + testCheck(disk, ref); TRACEMSG("6: passed\n"); } @@ -252,20 +205,24 @@ static void oldSeq2(BattFsSuper *disk) pgcnt_t ref[4]; TRACEMSG("7: 1 file with 1 old seq num, 1 free block\n"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 4; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 4); - fp = fopen(test_filename, "w+"); // page, inode, seq, fill, pgoff - 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); + battfs_writeTestBlock(&f.b, 0, 0, 0, DATA_SIZE, 0); + battfs_writeTestBlock(&f.b, 1, 0, 1, DATA_SIZE, 1); + battfs_writeTestBlock(&f.b, 2, 0, 0, DATA_SIZE, 1); + battfs_eraseBlock(&f.b, 3); - fclose(fp); ref[0] = 0; ref[1] = 1; ref[2] = 2; ref[3] = 3; + battfs_mount(disk, &f.b, page_array, sizeof(page_array)); testCheck(disk, ref); TRACEMSG("7: passed\n"); } @@ -276,21 +233,24 @@ static void oldSeq3(BattFsSuper *disk) TRACEMSG("8: 1 file with 1 old seq num, 1 free block\n"); - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 4; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 4); // page, inode, seq, fill, pgoff - disk->erase(disk, 0); - 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); - + battfs_eraseBlock(&f.b, 0); + battfs_writeTestBlock(&f.b, 1, 0, 0, DATA_SIZE, 0); + battfs_writeTestBlock(&f.b, 2, 0, 1, DATA_SIZE, 1); + battfs_writeTestBlock(&f.b, 3, 0, 0, DATA_SIZE, 1); - fclose(fp); ref[0] = 1; ref[1] = 2; ref[2] = 0; ref[3] = 3; + battfs_mount(disk, &f.b, page_array, sizeof(page_array)); testCheck(disk, ref); TRACEMSG("8: passed\n"); } @@ -301,20 +261,23 @@ static void oldSeq2File(BattFsSuper *disk) TRACEMSG("9: 2 file with old seq num, 2 free block\n"); - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 8; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 8); // page, inode, seq, fill, pgoff - disk->erase(disk, 0); - 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, disk->data_size, 0); - battfs_writeTestBlock(disk, 6, 4, 1, disk->data_size, 1); - battfs_writeTestBlock(disk, 7, 4, 0, disk->data_size, 1); + battfs_eraseBlock(&f.b, 0); + battfs_writeTestBlock(&f.b, 1, 0, 0, DATA_SIZE, 0); + battfs_writeTestBlock(&f.b, 2, 0, 3, DATA_SIZE, 1); + battfs_writeTestBlock(&f.b, 3, 0, 0, DATA_SIZE, 1); + battfs_eraseBlock(&f.b, 4); + battfs_writeTestBlock(&f.b, 5, 4, 0, DATA_SIZE, 0); + battfs_writeTestBlock(&f.b, 6, 4, 1, DATA_SIZE, 1); + battfs_writeTestBlock(&f.b, 7, 4, 0, DATA_SIZE, 1); - fclose(fp); ref[0] = 1; ref[1] = 2; ref[2] = 5; @@ -324,6 +287,7 @@ static void oldSeq2File(BattFsSuper *disk) ref[6] = 4; ref[7] = 7; + battfs_mount(disk, &f.b, page_array, sizeof(page_array)); testCheck(disk, ref); TRACEMSG("9: passed\n"); } @@ -334,7 +298,12 @@ static void openFile(BattFsSuper *disk) BattFs fd2; TRACEMSG("10: open file test, inode 0 and inode 4\n"); - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 8; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 8); + int PAGE_FILL = PAGE_SIZE - BATTFS_HEADER_LEN; inode_t INODE = 0; @@ -343,18 +312,16 @@ static void openFile(BattFsSuper *disk) unsigned int MODE = 0; // 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); - - ASSERT(battfs_init(disk)); + battfs_eraseBlock(&f.b, 0); + battfs_writeTestBlock(&f.b, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 3, INODE, 0, PAGE_FILL, 1); + battfs_eraseBlock(&f.b, 4); + battfs_writeTestBlock(&f.b, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 7, INODE2, 0, PAGE_FILL, 1); + + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(!battfs_fileExists(disk, INEXISTENT_INODE)); @@ -388,10 +355,12 @@ static void openFile(BattFsSuper *disk) ASSERT(LIST_HEAD(&disk->file_opened_list)->succ == &fd2.link); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(kfile_close(&fd2.fd) == 0); + ASSERT(kfile_error(&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"); } @@ -403,25 +372,28 @@ static void readFile(BattFsSuper *disk) TRACEMSG("11: read file test\n"); - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 8; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 8); + 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); + battfs_eraseBlock(&f.b, 0); + battfs_writeTestBlock(&f.b, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 3, INODE, 0, PAGE_FILL, 1); + battfs_eraseBlock(&f.b, 4); + battfs_writeTestBlock(&f.b, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 7, INODE2, 0, PAGE_FILL, 1); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); @@ -430,8 +402,9 @@ static void readFile(BattFsSuper *disk) ASSERT(buf[i] == 0xff); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("11: passed\n"); } @@ -442,25 +415,27 @@ static void readAcross(BattFsSuper *disk) TRACEMSG("12: read file test across page boundary and seek test\n"); - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 8; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 8); 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); + battfs_eraseBlock(&f.b, 0); + battfs_writeTestBlock(&f.b, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 3, INODE, 0, PAGE_FILL, 1); + battfs_eraseBlock(&f.b, 4); + battfs_writeTestBlock(&f.b, 5, INODE, 0, PAGE_FILL, 2); + battfs_writeTestBlock(&f.b, 6, INODE, 1, PAGE_FILL, 3); + battfs_writeTestBlock(&f.b, 7, INODE, 0, PAGE_FILL, 3); - fclose(fp); - - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); @@ -491,8 +466,9 @@ static void readAcross(BattFsSuper *disk) ASSERT(fd1.fd.seek_pos = (kfile_off_t)fd1.fd.size); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("12: passed\n"); } @@ -505,28 +481,31 @@ static void writeFile(BattFsSuper *disk) TRACEMSG("13: write file test\n"); - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 8; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 8); + 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); + battfs_eraseBlock(&f.b, 0); + battfs_writeTestBlock(&f.b, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 3, INODE, 0, PAGE_FILL, 1); + battfs_eraseBlock(&f.b, 4); + battfs_writeTestBlock(&f.b, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 7, INODE2, 0, PAGE_FILL, 1); for (size_t i = 0; i < sizeof(buf); i++) buf[i] = i; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); ASSERT(kfile_write(&fd1.fd, buf, sizeof(buf)) == sizeof(buf)); @@ -540,8 +519,9 @@ static void writeFile(BattFsSuper *disk) ASSERT(buf[i] == i); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("13: passed\n"); } @@ -552,25 +532,27 @@ static void writeAcross(BattFsSuper *disk) TRACEMSG("14: write file test across page boundary and seek test\n"); - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 8; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 8); 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); + battfs_eraseBlock(&f.b, 0); + battfs_writeTestBlock(&f.b, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 3, INODE, 0, PAGE_FILL, 1); + battfs_eraseBlock(&f.b, 4); + battfs_writeTestBlock(&f.b, 5, INODE, 0, PAGE_FILL, 2); + battfs_writeTestBlock(&f.b, 6, INODE, 1, PAGE_FILL, 3); + battfs_writeTestBlock(&f.b, 7, INODE, 0, PAGE_FILL, 3); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); @@ -612,8 +594,9 @@ static void writeAcross(BattFsSuper *disk) ASSERT(fd1.fd.seek_pos == (kfile_off_t)sizeof(buf) * 3); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("14: passed\n"); } @@ -623,16 +606,16 @@ 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); + KBlockFile f; + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT); BattFs fd1; inode_t INODE = 0; unsigned int MODE = BATTFS_CREATE; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); for (int i = 0; i < FILE_SIZE / 2; i++) @@ -641,10 +624,14 @@ static void createFile(BattFsSuper *disk) ASSERT(fd1.fd.seek_pos == FILE_SIZE / 2); ASSERT(fd1.fd.size == FILE_SIZE / 2); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); - ASSERT(battfs_init(disk)); + fpt = fopen(test_filename, "r+"); + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT); + + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, 0)); ASSERT(fd1.fd.size == FILE_SIZE / 2); @@ -659,8 +646,9 @@ static void createFile(BattFsSuper *disk) ASSERT(fd1.fd.seek_pos == FILE_SIZE / 2); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("15: passed\n"); @@ -671,17 +659,18 @@ 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); + KBlockFile f; + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT); + BattFs fd1; inode_t INODE = 0; unsigned int MODE = BATTFS_CREATE; uint8_t buf[1000]; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); @@ -704,10 +693,14 @@ static void multipleWrite(BattFsSuper *disk) ASSERT(disk->free_bytes == disk->disk_size - sizeof(buf)); } ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); + + fpt = fopen(test_filename, "r+"); + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(disk->free_bytes == disk->disk_size - sizeof(buf)); ASSERT(battfs_fileopen(disk, &fd1, INODE, 0)); @@ -717,8 +710,9 @@ static void multipleWrite(BattFsSuper *disk) for (unsigned i = 0; i < sizeof(buf); i++) ASSERT(buf[i] == ((j-1+i) & 0xff)); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("16: passed\n"); @@ -729,17 +723,19 @@ 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); + + KBlockFile f; + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT / 10); + BattFs fd1,fd2; inode_t INODE1 = 1, INODE2 = 2; unsigned int MODE = BATTFS_CREATE; uint8_t buf[1000]; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); ASSERT(battfs_fileopen(disk, &fd1, INODE1, MODE)); ASSERT(battfs_fileopen(disk, &fd2, INODE2, MODE)); @@ -763,9 +759,11 @@ static void increaseFile(BattFsSuper *disk) ASSERT(buf[i] == (i & 0xff)); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(kfile_close(&fd2.fd) == 0); + ASSERT(kfile_error(&fd2.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("17: passed\n"); } @@ -777,25 +775,28 @@ static void readEOF(BattFsSuper *disk) TRACEMSG("18: reading over EOF test\n"); - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 8; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 8); + 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); + battfs_eraseBlock(&f.b, 0); + battfs_writeTestBlock(&f.b, 1, INODE, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 2, INODE, 3, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 3, INODE, 0, PAGE_FILL, 1); + battfs_eraseBlock(&f.b, 4); + battfs_writeTestBlock(&f.b, 5, INODE2, 0, PAGE_FILL, 0); + battfs_writeTestBlock(&f.b, 6, INODE2, 1, PAGE_FILL, 1); + battfs_writeTestBlock(&f.b, 7, INODE2, 0, PAGE_FILL, 1); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); 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); @@ -803,8 +804,9 @@ static void readEOF(BattFsSuper *disk) ASSERT(kfile_read(&fd1.fd, buf, sizeof(buf)) == 0); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("18: passed\n"); } @@ -814,10 +816,10 @@ 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); + KBlockFile f; + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT / 5); BattFs fd1; inode_t INODE = 0; @@ -827,7 +829,7 @@ static void writeEOF(BattFsSuper *disk) for (int i = 0; i < 2; i++) buf[i] = i; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); disk_size_t prev_free = disk->free_bytes; ASSERT(battfs_fileopen(disk, &fd1, INODE, MODE)); @@ -883,8 +885,9 @@ static void writeEOF(BattFsSuper *disk) ASSERT(buf[i] == (i & 0xff)); ASSERT(kfile_close(&fd1.fd) == 0); + ASSERT(kfile_error(&fd1.fd) == 0); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("19: passed\n"); @@ -896,29 +899,33 @@ static void endOfSpace(BattFsSuper *disk) BattFs fd1; uint8_t buf[(PAGE_SIZE - BATTFS_HEADER_LEN) * 5]; - fp = fopen(test_filename, "w+"); + FILE *fp = fopen(test_filename, "w+"); + for (int i = 0; i < PAGE_SIZE * 4; i++) + fputc(0xff, fp); + KBlockFile f; + kblockfile_init(&f, fp, page_buffer, PAGE_SIZE, 4); 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); + battfs_eraseBlock(&f.b, 0); + battfs_eraseBlock(&f.b, 1); + battfs_eraseBlock(&f.b, 2); + battfs_eraseBlock(&f.b, 3); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); 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 == PAGE_FILL * 4); - ASSERT(fd1.fd.seek_pos == 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(kfile_error(&fd1.fd) == BATTFS_DISK_SPACEOVER_ERR); ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("20: passed\n"); } @@ -929,18 +936,17 @@ 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); + KBlockFile f; + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT); #define N_FILES 10 BattFs fd[N_FILES]; - inode_t INODE = 0; unsigned int MODE = BATTFS_CREATE; uint32_t buf[FILE_SIZE / (4 * N_FILES * sizeof(uint32_t))]; - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); for (inode_t i = 0; i < N_FILES; i++) ASSERT(battfs_fileopen(disk, &fd[i], i, MODE)); @@ -950,7 +956,7 @@ static void multipleFilesRW(BattFsSuper *disk) for (uint32_t j = 0; j < countof(buf); j++) buf[j] = j+i; - ASSERT(kfile_write(&fd[i], buf, sizeof(buf)) == sizeof(buf)); + 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); @@ -959,7 +965,7 @@ static void multipleFilesRW(BattFsSuper *disk) for (inode_t i = 0; i < N_FILES; i++) { memset(buf, 0, sizeof(buf)); - ASSERT(kfile_read(&fd[i], buf, sizeof(buf)) == 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); @@ -970,12 +976,18 @@ static void multipleFilesRW(BattFsSuper *disk) } for (inode_t i = 0; i < N_FILES; i++) + { ASSERT(kfile_close(&fd[i].fd) == 0); + ASSERT(kfile_error(&fd[i].fd) == 0); + } ASSERT(battfs_fsck(disk)); - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); + + fpt = fopen(test_filename, "r+"); + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT); - ASSERT(battfs_init(disk)); + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); ASSERT(battfs_fsck(disk)); for (inode_t i = 0; i < N_FILES; i++) @@ -984,7 +996,7 @@ static void multipleFilesRW(BattFsSuper *disk) for (inode_t i = 0; i < N_FILES; i++) { memset(buf, 0, sizeof(buf)); - ASSERT(kfile_read(&fd[i], buf, sizeof(buf)) == 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); @@ -995,27 +1007,74 @@ static void multipleFilesRW(BattFsSuper *disk) } for (inode_t i = 0; i < N_FILES; i++) + { ASSERT(kfile_close(&fd[i].fd) == 0); + ASSERT(kfile_error(&fd[i].fd) == 0); + } - ASSERT(battfs_close(disk)); + ASSERT(battfs_umount(disk)); TRACEMSG("21: passed\n"); } +static void openAllFiles(BattFsSuper *disk) +{ + TRACEMSG("22: try to open a lot of files\n"); + + FILE *fpt = fopen(test_filename, "w+"); + for (int i = 0; i < FILE_SIZE; i++) + fputc(0xff, fpt); + KBlockFile f; + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT); + + BattFs fd[BATTFS_MAX_FILES]; + unsigned int MODE = BATTFS_CREATE; + + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); + ASSERT(battfs_fsck(disk)); + for (unsigned i = 0; i < countof(fd); i++) + ASSERT(battfs_fileopen(disk, &fd[i], i, MODE)); + + ASSERT(battfs_fsck(disk)); + + for (unsigned i = 0; i < countof(fd); i++) + { + ASSERT(kfile_close(&fd[i].fd) == 0); + ASSERT(kfile_error(&fd[i].fd) == 0); + } + + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + + + fpt = fopen(test_filename, "r+"); + kblockfile_init(&f, fpt, page_buffer, PAGE_SIZE, PAGE_COUNT); + + ASSERT(battfs_mount(disk, &f.b, page_array, sizeof(page_array))); + ASSERT(battfs_fsck(disk)); + + + for (unsigned i = 0; i < countof(fd); i++) + ASSERT(battfs_fileopen(disk, &fd[i], i, MODE)); + + ASSERT(battfs_fsck(disk)); + + for (unsigned i = 0; i < countof(fd); i++) + { + ASSERT(kfile_close(&fd[i].fd) == 0); + ASSERT(kfile_error(&fd[i].fd) == 0); + } + + ASSERT(battfs_fsck(disk)); + ASSERT(battfs_umount(disk)); + TRACEMSG("22: 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; - disk.bufferWrite = disk_buffer_write; - disk.bufferRead = disk_buffer_read; - disk.save = disk_page_save; - disk.erase = disk_page_erase; - disk.close = disk_close; - diskNew(&disk); disk1File(&disk); diskHalfFile(&disk); @@ -1035,6 +1094,7 @@ int battfs_testRun(void) writeEOF(&disk); endOfSpace(&disk); multipleFilesRW(&disk); + openAllFiles(&disk); kprintf("All tests passed!\n"); @@ -1051,12 +1111,6 @@ int battfs_testTearDown(void) return 0; } -TEST_MAIN(battfs) - -#include -#include -#include -#include -#include +TEST_MAIN(battfs); #endif // _TEST