X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Ffs%2Fbattfs_test.c;h=d1b808261a61865fde75cf629bf6e9c437272d13;hb=73574965a258a596b337df51732cd78c874798db;hp=e5f50f02c4f5ac637cc9f956db55efd6b34352b6;hpb=b35451ada4bab9ca94be179615fe986eaee5df70;p=bertos.git diff --git a/bertos/fs/battfs_test.c b/bertos/fs/battfs_test.c index e5f50f02..d1b80826 100644 --- a/bertos/fs/battfs_test.c +++ b/bertos/fs/battfs_test.c @@ -69,37 +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", 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("addr:%d, size:%d", 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); + //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); + //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); + //TRACEMSG("page:%d", page); fseek(fp, page * d->page_size, SEEK_SET); for (int i = 0; i < d->page_size; i++) @@ -653,6 +662,103 @@ static void test14(BattFsSuper *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; @@ -661,6 +767,7 @@ int battfs_testRun(void) 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; @@ -678,6 +785,8 @@ int battfs_testRun(void) test12(&disk); test13(&disk); test14(&disk); + test15(&disk); + test16(&disk); kprintf("All tests passed!\n"); return 0;