From: asterix Date: Mon, 17 Mar 2008 10:26:08 +0000 (+0000) Subject: Split test suite in new file. X-Git-Tag: 1.0.0~60 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=4654a69f5df97af36ee5456d20cbccdc19012dc2;p=bertos.git Split test suite in new file. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1192 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/kern/kfile.c b/kern/kfile.c index 28adc32a..7607ba79 100644 --- a/kern/kfile.c +++ b/kern/kfile.c @@ -218,7 +218,7 @@ struct KFile * kfile_genericReopen(struct KFile *fd) return fd; } -#if CONFIG_TEST +#if CONFIG_TEST_KFILE /** * KFile read/write subtest. diff --git a/kern/kfile_test.c b/kern/kfile_test.c new file mode 100644 index 00000000..76e78092 --- /dev/null +++ b/kern/kfile_test.c @@ -0,0 +1,248 @@ +/** + * \file + * + * + * \brief Test suite for virtual KFile I/O interface. + * This module implements a test for some generic I/O interfaces for kfile. + * + * \version $Id$ + * \author Francesco Sacchi + * \author Daniele Basile + * + */ + + +#include "kfile.h" +#include + +#include +#include +#include + +/** + * KFile read/write subtest. + * Try to write/read in the same \a f file location \a size bytes. + * \return true if all is ok, false otherwise + * \note Restore file position at exit (if no error) + * \note Test buffer \a buf must be filled with + * the following statement: + *
+ * buf[i] = i & 0xff
+ * 
+ */ +static bool kfile_rwTest(KFile *f, uint8_t *buf, size_t size) +{ + /* + * Write test buffer + */ + if (kfile_write(f, buf, size) != size) + return false; + + kfile_seek(f, -(kfile_off_t)size, KSM_SEEK_CUR); + + /* + * Reset test buffer + */ + memset(buf, 0, size); + + /* + * Read file in test buffer + */ + if (kfile_read(f, buf, size) != size) + return false; + kfile_seek(f, -(kfile_off_t)size, KSM_SEEK_CUR); + + /* + * Check test result + */ + for (size_t i = 0; i < size; i++) + if (buf[i] != (i & 0xff)) + return false; + + return true; +} + +/** + * KFile read/write test. + * This function write and read \a test_buf long \a size + * on \a fd handler. + * \a save_buf can be NULL or a buffer where to save previous file content. + */ +bool kfile_test(KFile *fd, uint8_t *test_buf, uint8_t *save_buf, size_t size) +{ + /* + * Part of test buf size that you would write. + * This var is used in test 3 to check kfile_write + * when writing beyond filesize limit. + */ + kfile_off_t len = size / 2; + + + /* Fill test buffer */ + for (size_t i = 0; i < size; i++) + test_buf[i] = (i & 0xff); + + /* + * If necessary, user can save content, + * for later restore. + */ + if (save_buf) + { + kfile_read(fd, save_buf, size); + kprintf("Saved content..form [%lu] to [%lu]\n", fd->seek_pos, fd->seek_pos + size); + } + + /* TEST 1 BEGIN. */ + kprintf("Test 1: write from pos 0 to [%lu]\n", size); + + /* + * Seek to addr 0. + */ + if (kfile_seek(fd, 0, KSM_SEEK_SET) != 0) + goto kfile_test_end; + + /* + * Test read/write to address 0..size + */ + if (!kfile_rwTest(fd, test_buf, size)) + goto kfile_test_end; + + kprintf("Test 1: ok!\n"); + + /* + * Restore previous read content. + */ + if (save_buf) + { + kfile_seek(fd, 0, KSM_SEEK_SET); + + if (kfile_write(fd, save_buf, size) != size) + goto kfile_test_end; + + kprintf("Restore content..form [%lu] to [%lu]\n", fd->seek_pos, fd->seek_pos + size); + } + /* TEST 1 END. */ + + /* TEST 2 BEGIN. */ + kprintf("Test 2: write from pos [%lu] to [%lu]\n", fd->size/2 , fd->size/2 + size); + + /* + * Go to half test size. + */ + kfile_seek(fd, (fd->size / 2), KSM_SEEK_SET); + + /* + * If necessary, user can save content + * for later restore. + */ + if (save_buf) + { + kfile_read(fd, save_buf, size); + kfile_seek(fd, -(kfile_off_t)size, KSM_SEEK_CUR); + kprintf("Saved content..form [%lu] to [%lu]\n", fd->seek_pos, fd->seek_pos + size); + } + + /* + * Test read/write to address filesize/2 ... filesize/2 + size + */ + if (!kfile_rwTest(fd, test_buf, size)) + goto kfile_test_end; + + kprintf("Test 2: ok!\n"); + + /* + * Restore previous content. + */ + if (save_buf) + { + kfile_seek(fd, -(kfile_off_t)size, KSM_SEEK_CUR); + + if (kfile_write(fd, save_buf, size) != size) + goto kfile_test_end; + + kprintf("Restore content..form [%lu] to [%lu]\n", fd->seek_pos, fd->seek_pos + size); + } + + /* TEST 2 END. */ + + /* TEST 3 BEGIN. */ + kprintf("Test 3: write outside of fd->size limit [%lu]\n", fd->size); + kprintf("This test should FAIL!, you must see an assertion fail message.\n"); + + /* + * Go to the Flash end + */ + kfile_seek(fd, -len, KSM_SEEK_END); + + /* + * If necessary, user can save content, + * for later restore. + */ + if (save_buf) + { + kfile_read(fd, save_buf, len); + kfile_seek(fd, -len, KSM_SEEK_CUR); + kprintf("Saved content..form [%lu] to [%lu]\n", fd->seek_pos, fd->seek_pos + len); + } + + /* + * Test read/write to address (filesize - size) ... filesize + */ + if (kfile_rwTest(fd, test_buf, size)) + goto kfile_test_end; + + kprintf("Test 3: ok!\n"); + + /* + * Restore previous read content + */ + if (save_buf) + { + kfile_seek(fd, -len, KSM_SEEK_END); + + if (kfile_write(fd, save_buf, len) != len) + goto kfile_test_end; + + kprintf("Restore content..form [%lu] to [%lu]\n", fd->seek_pos, fd->seek_pos + len); + } + + /* TEST 3 END. */ + + kfile_close(fd); + return true; + +kfile_test_end: + kfile_close(fd); + return false; +} + + +