diff options
author | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2010-01-19 08:55:18 +0000 |
---|---|---|
committer | Thomas Doerfler <Thomas.Doerfler@embedded-brains.de> | 2010-01-19 08:55:18 +0000 |
commit | 64734fc14b1015c1568c2906c9aeab1c6a7db82d (patch) | |
tree | 853af83fb05c8fcf05e3d7c44308895377b0028d /testsuites/libtests/block08/bdbuf_tests.c | |
parent | 2010-01-18 Joel Sherrill <joel.sherrill@oarcorp.com> (diff) | |
download | rtems-64734fc14b1015c1568c2906c9aeab1c6a7db82d.tar.bz2 |
updates and new test cases
Diffstat (limited to '')
-rw-r--r-- | testsuites/libtests/block08/bdbuf_tests.c | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/testsuites/libtests/block08/bdbuf_tests.c b/testsuites/libtests/block08/bdbuf_tests.c new file mode 100644 index 0000000000..642032a290 --- /dev/null +++ b/testsuites/libtests/block08/bdbuf_tests.c @@ -0,0 +1,271 @@ +/*! @file + * @brief Implementation of auxiliary functions of bdbuf tests. + * + * Copyright (C) 2010 OKTET Labs, St.-Petersburg, Russia + * Author: Oleg Kravtsov <Oleg.Kravtsov@oktetlabs.ru> + * + * 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. + * + * $Id$ + */ + +#include <stdio.h> +#include <errno.h> + +#include <rtems.h> +#include <rtems/io.h> +#include <rtems/diskdevs.h> +#include <rtems/bdbuf.h> +#include "bdbuf_tests.h" + + +struct bdbuf_test_descr { + void (* main)(void); +} bdbuf_tests[] = { +#if 0 + { bdbuf_test1_1_main }, + { bdbuf_test1_2_main }, + { bdbuf_test1_3_main }, +#endif + { bdbuf_test1_4_main }, + { bdbuf_test1_5_main }, + + { bdbuf_test2_1_main }, + { bdbuf_test2_2_main }, + + { bdbuf_test3_1_main }, + { bdbuf_test3_2_main }, + { bdbuf_test3_3_main }, + + { bdbuf_test4_1_main }, + { bdbuf_test4_2_main }, + { bdbuf_test4_3_main }, +}; + +#define TEST_SEM_ATTRIBS RTEMS_DEFAULT_ATTRIBUTES + +/** Device ID used for testing */ +dev_t test_dev = (dev_t)-1; + +/** Test result variable */ +bool good_test_result = true; + +test_ctx g_test_ctx; + +const char *test_name = "NO TEST"; + +bdbuf_test_msg test_drv_msg; + +/** Count of messages in RX message queue used on disk driver side. */ +#define TEST_DRV_RX_MQUEUE_COUNT 10 +/** Name of disk driver RX message queue. */ +#define TEST_DRV_RX_MQUEUE_NAME (rtems_build_name( 'M', 'Q', 'D', ' ' )) + +/** Count of messages in Test task RX message queue */ +#define TEST_TASK_RX_MQUEUE_COUNT 10 +/** Name of Test task RX message queue */ +#define TEST_TASK_RX_MQUEUE_NAME (rtems_build_name( 'M', 'Q', 'T', ' ' )) + +rtems_status_code +bdbuf_test_start_aux_task(rtems_name name, + rtems_task_entry entry_point, + rtems_task_argument arg, + Objects_Id *id) +{ + rtems_status_code rc; + Objects_Id task_id; + + rc = rtems_task_create(name, BDBUF_TEST_THREAD_PRIO_NORMAL, 1024 * 2, + RTEMS_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, + RTEMS_LOCAL | RTEMS_NO_FLOATING_POINT, + &task_id); + if (rc != RTEMS_SUCCESSFUL) + { + printf("Failed to create task\n"); + return rc; + } + + rc = rtems_task_start(task_id, entry_point, arg); + if (rc != RTEMS_SUCCESSFUL) + { + printf("Failed to start task\n"); + } + else + { + if (id != NULL) + *id = task_id; + } + return rc; +} + +void +run_bdbuf_tests() +{ + rtems_disk_device *disk; + rtems_status_code sc; + dev_t dev = -1; + unsigned int i; + + rtems_device_major_number major; + rtems_driver_address_table testdisk = { + test_disk_initialize, + RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES + }; + + /* Create a message queue to get events from disk driver. */ + sc = rtems_message_queue_create(TEST_TASK_RX_MQUEUE_NAME, + TEST_TASK_RX_MQUEUE_COUNT, + sizeof(bdbuf_test_msg), + RTEMS_DEFAULT_ATTRIBUTES, + &g_test_ctx.test_qid); + + if (sc != RTEMS_SUCCESSFUL) + { + printk("Failed to create message queue for test task: %u\n", sc); + return; + } + + /* Register a disk device that is used in tests */ + sc = rtems_io_register_driver(0, &testdisk, &major); + if (sc != RTEMS_SUCCESSFUL) + { + printk("Failed to register TEST DEVICE: %d\n", sc); + return; + } + + test_dev = -1; + while ((disk = rtems_disk_next(dev)) != NULL) + { + printk("DEV: %s [%lu]\n", disk->name, disk->size); + dev = disk->dev; + if (strcmp(disk->name, TEST_DISK_NAME) == 0) + test_dev = dev; + rtems_disk_release(disk); + } + + if (test_dev == (dev_t)-1) + { + printf("Failed to find %s disk\n", TEST_DISK_NAME); + return; + } + + /* + * On initialization test disk device driver registers + * its RX message queue, so we just need to locate it. + */ + sc = rtems_message_queue_ident(TEST_DRV_RX_MQUEUE_NAME, + RTEMS_SEARCH_ALL_NODES, + &g_test_ctx.test_drv_qid); + if (sc != RTEMS_SUCCESSFUL) + { + printf("Failed to find Test Driver Queue: %u\n", sc); + return; + } + + for (i = 0; i < ARRAY_NUM(g_test_ctx.test_sync_main); i++) + { + sc = rtems_semaphore_create(rtems_build_name('T', 'S', 'M', '0' + i), + 0, TEST_SEM_ATTRIBS, 0, + &g_test_ctx.test_sync_main[i]); + if (sc != RTEMS_SUCCESSFUL) + { + printk("Failed to create sync sem for test task: %u\n", sc); + return; + } + } + + for (i = 0; i < ARRAY_NUM(g_test_ctx.test_sync); i++) + { + sc = rtems_semaphore_create(rtems_build_name('T', 'S', 'T', '0' + i), + 0, TEST_SEM_ATTRIBS, 0, + &g_test_ctx.test_sync[i]); + if (sc != RTEMS_SUCCESSFUL) + { + printk("Failed to create sync sem for test task #%d: %u\n", i + 1, sc); + return; + } + } + + sc = rtems_semaphore_create(rtems_build_name('T', 'S', 'M', 'E'), + 0, TEST_SEM_ATTRIBS, 0, + &g_test_ctx.test_end_main); + if (sc != RTEMS_SUCCESSFUL) + { + printk("Failed to create end sync sem for test task: %u\n", sc); + return; + } + + for (i = 0; i < ARRAY_NUM(g_test_ctx.test_task); i++) + g_test_ctx.test_task[i] = OBJECTS_ID_NONE; + + for (i = 0; i < sizeof(bdbuf_tests) / sizeof(bdbuf_tests[0]); i++) + { + bdbuf_tests[i].main(); + } +} + + +rtems_status_code +bdbuf_test_create_drv_rx_queue(Objects_Id *id) +{ + return rtems_message_queue_create(TEST_DRV_RX_MQUEUE_NAME, + TEST_DRV_RX_MQUEUE_COUNT, + sizeof(bdbuf_test_msg), + RTEMS_DEFAULT_ATTRIBUTES, + id); +} + +rtems_status_code +bdbuf_test_create_drv_tx_queue(Objects_Id *id) +{ + return rtems_message_queue_ident(TEST_TASK_RX_MQUEUE_NAME, + RTEMS_SEARCH_ALL_NODES, + id); +} + +rtems_status_code +bdbuf_test_start_thread(unsigned int idx, rtems_task_entry func) +{ + rtems_status_code sc; + + if (g_test_ctx.test_task[idx] != OBJECTS_ID_NONE) + { + sc = rtems_task_delete(g_test_ctx.test_task[idx]); + if (sc != RTEMS_SUCCESSFUL) + { + printk("Failed to delete test thread %u in test %s\n", + idx + 1, g_test_ctx.test_name); + return sc; + } + } + sc = bdbuf_test_start_aux_task( + rtems_build_name('T', 'S', '.', '0' + idx), + func, (rtems_task_argument)(NULL), + &g_test_ctx.test_task[idx]); + return sc; +} + +rtems_status_code +bdbuf_test_end() +{ + rtems_status_code sc; + unsigned int i; + + for (i = 0; i < ARRAY_NUM(g_test_ctx.test_task); i++) + { + if (g_test_ctx.test_task[i] != OBJECTS_ID_NONE) + { + sc = rtems_semaphore_obtain(g_test_ctx.test_end_main, + RTEMS_WAIT, RTEMS_NO_TIMEOUT); + if (sc != RTEMS_SUCCESSFUL) + { + printk("Failed to get a thread stopped\n"); + } + g_test_ctx.test_task[i] = OBJECTS_ID_NONE; + } + } + return RTEMS_SUCCESSFUL; +} + |