diff options
Diffstat (limited to 'testsuites/libtests')
-rw-r--r-- | testsuites/libtests/Makefile.am | 1 | ||||
-rw-r--r-- | testsuites/libtests/block13/Makefile.am | 19 | ||||
-rw-r--r-- | testsuites/libtests/block13/block13.doc | 11 | ||||
-rw-r--r-- | testsuites/libtests/block13/block13.scn | 11 | ||||
-rw-r--r-- | testsuites/libtests/block13/init.c | 232 | ||||
-rw-r--r-- | testsuites/libtests/configure.ac | 1 |
6 files changed, 275 insertions, 0 deletions
diff --git a/testsuites/libtests/Makefile.am b/testsuites/libtests/Makefile.am index 1274f2637b..9747ad19c6 100644 --- a/testsuites/libtests/Makefile.am +++ b/testsuites/libtests/Makefile.am @@ -1,6 +1,7 @@ ACLOCAL_AMFLAGS = -I ../aclocal SUBDIRS = POSIX +SUBDIRS += block13 SUBDIRS += rbheap01 SUBDIRS += flashdisk01 diff --git a/testsuites/libtests/block13/Makefile.am b/testsuites/libtests/block13/Makefile.am new file mode 100644 index 0000000000..9b4a76d0eb --- /dev/null +++ b/testsuites/libtests/block13/Makefile.am @@ -0,0 +1,19 @@ +rtems_tests_PROGRAMS = block13 +block13_SOURCES = init.c + +dist_rtems_tests_DATA = block13.scn block13.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(block13_OBJECTS) +LINK_LIBS = $(block13_LDLIBS) + +block13$(EXEEXT): $(block13_OBJECTS) $(block13_DEPENDENCIES) + @rm -f block13$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/libtests/block13/block13.doc b/testsuites/libtests/block13/block13.doc new file mode 100644 index 0000000000..04fc066ada --- /dev/null +++ b/testsuites/libtests/block13/block13.doc @@ -0,0 +1,11 @@ +This file describes the directives and concepts tested by this test set. + +test set name: block13 + +directives: + + TBD + +concepts: + + Tests the read-ahead feature of bdbuf. diff --git a/testsuites/libtests/block13/block13.scn b/testsuites/libtests/block13/block13.scn new file mode 100644 index 0000000000..8cce71806d --- /dev/null +++ b/testsuites/libtests/block13/block13.scn @@ -0,0 +1,11 @@ +*** TEST BLOCK 13 *** +0 2 3 4 5 6 7 8 +reset +8 +reset +7 +reset +6 7 +reset +5 6 8 +*** END OF TEST BLOCK 13 *** diff --git a/testsuites/libtests/block13/init.c b/testsuites/libtests/block13/init.c new file mode 100644 index 0000000000..43ce38860e --- /dev/null +++ b/testsuites/libtests/block13/init.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2012 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include "tmacros.h" + +#include <errno.h> +#include <string.h> + +#include <rtems/blkdev.h> +#include <rtems/bdbuf.h> + +#define BLOCK_COUNT 9 +#define READ_COUNT 19 + +static int block_access_counts [BLOCK_COUNT]; + +#define RESET_CACHE (-1) + +static const int action_sequence [READ_COUNT] = { + 0, 2, 3, 4, 5, 6, 7, 8, + RESET_CACHE, + 8, + RESET_CACHE, + 7, + RESET_CACHE, + 6, 7, + RESET_CACHE, + 5, 6, 8 +}; + +#define UNUSED_LINE { 0, 0, 0, 0, 0, 0, 0, 0, 0 } + +static int expected_block_access_counts [READ_COUNT] [BLOCK_COUNT] = { + { 1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 0, 1, 0, 0, 0, 0, 0, 0 }, + { 1, 0, 1, 1, 1, 1, 0, 0, 0 }, + { 1, 0, 1, 1, 1, 1, 0, 0, 0 }, + { 1, 0, 1, 1, 1, 1, 1, 1, 0 }, + { 1, 0, 1, 1, 1, 1, 1, 1, 0 }, + { 1, 0, 1, 1, 1, 1, 1, 1, 1 }, + { 1, 0, 1, 1, 1, 1, 1, 1, 1 }, + UNUSED_LINE, + { 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + UNUSED_LINE, + { 0, 0, 0, 0, 0, 0, 0, 1, 0 }, + UNUSED_LINE, + { 0, 0, 0, 0, 0, 0, 1, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 1, 1 }, + UNUSED_LINE, + { 0, 0, 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 1, 1, 1, 1 }, + { 0, 0, 0, 0, 0, 1, 1, 1, 1 } +}; + +#define NO_TRIGGER RTEMS_DISK_READ_AHEAD_NO_TRIGGER + +#define TRIGGER_AFTER_RESET RTEMS_DISK_READ_AHEAD_NO_TRIGGER + +static const rtems_blkdev_bnum trigger [READ_COUNT] = { + 1, 3, 5, 5, 7, 7, NO_TRIGGER, NO_TRIGGER, + TRIGGER_AFTER_RESET, + 9, + TRIGGER_AFTER_RESET, + 8, + TRIGGER_AFTER_RESET, + 7, NO_TRIGGER, + TRIGGER_AFTER_RESET, + 6, 8, NO_TRIGGER +}; + +#define NOT_CHANGED_BY_RESET(i) (i) + +static const rtems_blkdev_bnum next [READ_COUNT] = { + 2, 4, 6, 6, 8, 8, 8, 8, + NOT_CHANGED_BY_RESET(8), + 10, + NOT_CHANGED_BY_RESET(10), + 9, + NOT_CHANGED_BY_RESET(9), + 8, 8, + NOT_CHANGED_BY_RESET(8), + 7, 9, 9 +}; + +static int test_disk_ioctl(rtems_disk_device *dd, uint32_t req, void *arg) +{ + int rv = 0; + + if (req == RTEMS_BLKIO_REQUEST) { + rtems_blkdev_request *breq = arg; + rtems_blkdev_sg_buffer *sg = breq->bufs; + uint32_t i; + + rtems_test_assert(breq->req == RTEMS_BLKDEV_REQ_READ); + + for (i = 0; i < breq->bufnum; ++i) { + rtems_blkdev_bnum block = sg [i].block; + + rtems_test_assert(block < BLOCK_COUNT); + + ++block_access_counts [block]; + } + + (*breq->req_done)(breq->done_arg, RTEMS_SUCCESSFUL); + } else { + errno = EINVAL; + rv = -1; + } + + return rv; +} + +static void test_read_ahead(rtems_disk_device *dd) +{ + int i; + + for (i = 0; i < READ_COUNT; ++i) { + int action = action_sequence [i]; + + if (action != RESET_CACHE) { + rtems_blkdev_bnum block = (rtems_blkdev_bnum) action; + rtems_status_code sc; + rtems_bdbuf_buffer *bd; + + printf("%i ", action); + + sc = rtems_bdbuf_read(dd, block, &bd); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_bdbuf_release(bd); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert( + memcmp( + block_access_counts, + expected_block_access_counts [i], + sizeof(block_access_counts) + ) == 0 + ); + } else { + printf("\nreset\n"); + + rtems_bdbuf_purge_dev(dd); + memset(&block_access_counts, 0, sizeof(block_access_counts)); + } + + rtems_test_assert(trigger [i] == dd->read_ahead.trigger); + rtems_test_assert(next [i] == dd->read_ahead.next); + } + + printf("\n"); +} + +static void test(void) +{ + rtems_status_code sc; + dev_t dev = 0; + rtems_disk_device *dd; + + sc = rtems_disk_io_initialize(); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_disk_create_phys( + dev, + 1, + BLOCK_COUNT, + test_disk_ioctl, + NULL, + NULL + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + dd = rtems_disk_obtain(dev); + rtems_test_assert(dd != NULL); + + test_read_ahead(dd); + + sc = rtems_disk_release(dd); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_disk_delete(dev); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +static void Init(rtems_task_argument arg) +{ + puts("\n\n*** TEST BLOCK 13 ***"); + + test(); + + puts("*** END OF TEST BLOCK 13 ***"); + + rtems_test_exit(0); +} + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK + +#define CONFIGURE_BDBUF_BUFFER_MIN_SIZE 1 +#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE 1 +#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE BLOCK_COUNT +#define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS 2 +#define CONFIGURE_BDBUF_READ_AHEAD_TASK_PRIORITY 1 + +#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM + +#define CONFIGURE_MAXIMUM_TASKS 1 + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES +#define CONFIGURE_INIT_TASK_PRIORITY 2 + +#define CONFIGURE_INIT + +#include <rtems/confdefs.h> diff --git a/testsuites/libtests/configure.ac b/testsuites/libtests/configure.ac index f6af3b11cd..7df0520f87 100644 --- a/testsuites/libtests/configure.ac +++ b/testsuites/libtests/configure.ac @@ -41,6 +41,7 @@ AM_CONDITIONAL(NETTESTS,test "$rtems_cv_RTEMS_NETWORKING" = "yes") # Explicitly list all Makefiles here AC_CONFIG_FILES([Makefile +block13/Makefile rbheap01/Makefile syscall01/Makefile flashdisk01/Makefile |