From 572f22cd20c155c6a75485335892a5ab8a27903c Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Fri, 4 Mar 2016 14:25:48 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9010 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- test/nasa_osal/test.mk | 8 + test/nasa_osal/test_root.c | 50 ++++ test/nasa_osal/test_root.h | 68 ++++++ test/nasa_osal/test_sequence_001.c | 453 +++++++++++++++++++++++++++++++++++++ test/nasa_osal/test_sequence_001.h | 22 ++ 5 files changed, 601 insertions(+) create mode 100644 test/nasa_osal/test.mk create mode 100644 test/nasa_osal/test_root.c create mode 100644 test/nasa_osal/test_root.h create mode 100644 test/nasa_osal/test_sequence_001.c create mode 100644 test/nasa_osal/test_sequence_001.h (limited to 'test') diff --git a/test/nasa_osal/test.mk b/test/nasa_osal/test.mk new file mode 100644 index 000000000..dcaa7197f --- /dev/null +++ b/test/nasa_osal/test.mk @@ -0,0 +1,8 @@ +# List of all the NASA OSAL over ChibiOS/RT test files. +TESTSRC = ${CHIBIOS}/test/lib/ch_test.c \ + ${CHIBIOS}/test/nasa_osal/test_root.c \ + ${CHIBIOS}/test/nasa_osal/test_sequence_001.c + +# Required include directories +TESTINC = ${CHIBIOS}/test/lib \ + ${CHIBIOS}/test/nasa_osal diff --git a/test/nasa_osal/test_root.c b/test/nasa_osal/test_root.c new file mode 100644 index 000000000..e6a803c40 --- /dev/null +++ b/test/nasa_osal/test_root.c @@ -0,0 +1,50 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file test_root.c + * @brief Test Suite root structures code. + * + * @addtogroup CH_TEST_ROOT + * @{ + */ + +#include "hal.h" +#include "ch_test.h" +#include "osapi.h" + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +THD_WORKING_AREA(wa_test1, TASKS_STACK_SIZE); +THD_WORKING_AREA(wa_test2, TASKS_STACK_SIZE); +THD_WORKING_AREA(wa_test3, TASKS_STACK_SIZE); +THD_WORKING_AREA(wa_test4, TASKS_STACK_SIZE); + +/** + * @brief Array of all the test sequences. + */ +const testcase_t * const *test_suite[] = { + test_sequence_001, + NULL +}; + +/*===========================================================================*/ +/* Shared code. */ +/*===========================================================================*/ + +/** @} */ diff --git a/test/nasa_osal/test_root.h b/test/nasa_osal/test_root.h new file mode 100644 index 000000000..a30317d22 --- /dev/null +++ b/test/nasa_osal/test_root.h @@ -0,0 +1,68 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file test_root.h + * @brief Test Suite root structures header. + * + * @addtogroup CH_TEST_ROOT + * @{ + */ + +#ifndef _TEST_ROOT_H_ +#define _TEST_ROOT_H_ + +#include "ch.h" + +#include "test_sequence_001.h" + +/*===========================================================================*/ +/* Default definitions. */ +/*===========================================================================*/ + +/* Global test suite name, it is printed on top of the test + report header.*/ +#define TEST_SUITE_NAME "NASA OSAL over ChibiOS/RT Test Suite" + +#define TASKS_BASE_PRIORITY 200 +#define TASKS_STACK_SIZE 256 + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +extern const testcase_t * const *test_suite[]; + +extern THD_WORKING_AREA(wa_test1, TASKS_STACK_SIZE); +extern THD_WORKING_AREA(wa_test2, TASKS_STACK_SIZE); +extern THD_WORKING_AREA(wa_test3, TASKS_STACK_SIZE); +extern THD_WORKING_AREA(wa_test4, TASKS_STACK_SIZE); + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Shared definitions. */ +/*===========================================================================*/ + +#endif /* _TEST_ROOT_H_ */ + +/** @} */ diff --git a/test/nasa_osal/test_sequence_001.c b/test/nasa_osal/test_sequence_001.c new file mode 100644 index 000000000..0e4063289 --- /dev/null +++ b/test/nasa_osal/test_sequence_001.c @@ -0,0 +1,453 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "hal.h" +#include "ch.h" +#include "osapi.h" +#include "ch_test.h" + +/** + * @page test_sequence_001 Threads Functionality + * + * File: @ref test_sequence_001.c + * + *

Description

+ * This sequence tests the NASA OSAL over ChibiOS/RT functionalities related + * to threading. + * + *

Test Cases

+ * - @subpage test_001_001 + * . + */ + +/**************************************************************************** + * Shared code. + ****************************************************************************/ + +static void test_thread1(void) { + + test_emit_token('A'); +} + +static void test_thread2(void) { + + test_emit_token('B'); +} + +static void test_thread3(void) { + + test_emit_token('C'); +} + +static void test_thread4(void) { + + test_emit_token('D'); +} + +/**************************************************************************** + * Test cases. + ****************************************************************************/ + +#if TRUE || defined(__DOXYGEN__) +/** + * @page test_001_001 OS_TaskCreate() errors + * + *

Description

+ * Parameters checking in OS_TaskCreate() is tested. + * + *

Conditions

+ * None. + * + *

Test Steps

+ * - Testing NULL task_id. + * - Testing NULL task_name. + * - Testing NULL stack_pointer. + * - Testing long task name. + * - Testing priority limits. + * - Testing insufficient stack size. + * - Testing task name or task stack conflict. + * . + */ + +static void test_001_001_execute(void) { + + /* Testing NULL task_id.*/ + test_set_step(1); + { + int32 err; + + err = OS_TaskCreate(NULL, /* Error.*/ + "failing thread", + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + TASKS_BASE_PRIORITY, + 0); + test_assert(err == OS_INVALID_POINTER, "NULL not detected"); + test_assert_sequence("", "task executed"); + } + + /* Testing NULL task_name.*/ + test_set_step(2); + { + int32 err; + uint32 tid; + + err = OS_TaskCreate(&tid, + NULL, /* Error.*/ + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + TASKS_BASE_PRIORITY, + 0); + test_assert(err == OS_INVALID_POINTER, "NULL not detected"); + test_assert_sequence("", "task executed"); + } + + /* Testing NULL stack_pointer.*/ + test_set_step(3); + { + int32 err; + uint32 tid; + + err = OS_TaskCreate(&tid, + "failing thread", + test_thread1, + (uint32 *)NULL, /* Error.*/ + sizeof wa_test1, + TASKS_BASE_PRIORITY, + 0); + test_assert(err == OS_INVALID_POINTER, "NULL not detected"); + test_assert_sequence("", "task executed"); + } + + /* Testing long task name.*/ + test_set_step(4); + { + int32 err; + uint32 tid; + + err = OS_TaskCreate(&tid, + "this is a very very long task name", /* Error.*/ + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + TASKS_BASE_PRIORITY, + 0); + test_assert(err == OS_ERR_NAME_TOO_LONG, "name limit not detected"); + test_assert_sequence("", "task executed"); + } + + /* Testing priority limits.*/ + test_set_step(5); + { + int32 err; + uint32 tid; + + err = OS_TaskCreate(&tid, + "failing thread", + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + 0, /* Error.*/ + 0); + test_assert(err == OS_ERR_INVALID_PRIORITY, "priority error not detected"); + test_assert_sequence("", "task executed"); + + err = OS_TaskCreate(&tid, + "failing thread", + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + 256, /* Error.*/ + 0); + test_assert(err == OS_ERR_INVALID_PRIORITY, "priority error not detected"); + test_assert_sequence("", "task executed"); + } + + /* Testing insufficient stack size.*/ + test_set_step(6); + { + int32 err; + uint32 tid; + + err = OS_TaskCreate(&tid, + "failing thread", + test_thread1, + (uint32 *)wa_test1, + 16, /* Error.*/ + TASKS_BASE_PRIORITY, + 0); + test_assert(err == OS_INVALID_INT_NUM, "stack insufficient size not detected"); + test_assert_sequence("", "task executed"); + } + + /* Testing task name or task stack conflict.*/ + test_set_step(7); + { + int32 err; + uint32 tid; + + err = OS_TaskCreate(&tid, + "running thread", + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + TASKS_BASE_PRIORITY, + 0); + test_assert(err == OS_SUCCESS, "task creation failed"); + + err = OS_TaskCreate(&tid, + "running thread", + test_thread2, + (uint32 *)wa_test2, + sizeof wa_test2, + TASKS_BASE_PRIORITY, + 0); + test_assert(err == OS_ERR_NAME_TAKEN, "name conflict not detected"); + + err = OS_TaskCreate(&tid, + "another running thread", + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + TASKS_BASE_PRIORITY, + 0); + test_assert(err == OS_ERR_NO_FREE_IDS, "stack conflict not detected"); + + OS_TaskDelay(5); + test_assert_sequence("A", "task not executed"); + + err = OS_TaskCreate(&tid, + "running thread", + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + TASKS_BASE_PRIORITY, + 0); + test_assert(err == OS_SUCCESS, "task creation failed"); + + OS_TaskDelay(5); + test_assert_sequence("A", "task not executed"); + } +} + +static const testcase_t test_001_001 = { + "OS_TaskCreate() errors", + NULL, + NULL, + test_001_001_execute +}; +#endif /* TRUE */ + +#if TRUE || defined(__DOXYGEN__) +/** + * @page test_001_001 OS_TaskCreate() priority ordering + * + *

Description

+ * Four tasks are created at different priorities and in different orders + * then their execution order is tested. + * + *

Conditions

+ * None. + * + *

Test Steps

+ * - Tasks are created in priority order from low to high. + * - Tasks are made runnable atomically and their execution order tested. + * - Tasks are created in priority order from high to low. + * - Tasks are made runnable atomically and their execution order tested. + * - Tasks are created in an not ordered way. + * - Tasks are made runnable atomically and their execution order tested. + * . + */ + +static void test_001_002_execute(void) { + + /* Tasks are created in priority order from low to high.*/ + test_set_step(1); + { + int32 err; + uint32 tid1, tid2, tid3, tid4; + + err = OS_TaskCreate(&tid4, + "running thread 4", + test_thread4, + (uint32 *)wa_test4, + sizeof wa_test4, + TASKS_BASE_PRIORITY - 0, + 0); + test_assert(err == OS_SUCCESS, "task 4 creation failed"); + + err = OS_TaskCreate(&tid3, + "running thread 3", + test_thread3, + (uint32 *)wa_test3, + sizeof wa_test3, + TASKS_BASE_PRIORITY - 1, + 0); + test_assert(err == OS_SUCCESS, "task 3 creation failed"); + + err = OS_TaskCreate(&tid2, + "running thread 2", + test_thread2, + (uint32 *)wa_test2, + sizeof wa_test2, + TASKS_BASE_PRIORITY - 2, + 0); + test_assert(err == OS_SUCCESS, "task 2 creation failed"); + + err = OS_TaskCreate(&tid1, + "running thread 1", + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + TASKS_BASE_PRIORITY - 3, + 0); + test_assert(err == OS_SUCCESS, "task 1 creation failed"); + } + + /* Tasks are made runnable atomically and their execution order tested.*/ + test_set_step(2); + { + OS_TaskDelay(5); + test_assert_sequence("ABCD", "task order violation"); + } + + /* Tasks are created in priority order from high to low.*/ + test_set_step(3); + { + int32 err; + uint32 tid1, tid2, tid3, tid4; + + err = OS_TaskCreate(&tid1, + "running thread 1", + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + TASKS_BASE_PRIORITY - 3, + 0); + test_assert(err == OS_SUCCESS, "task 1 creation failed"); + + err = OS_TaskCreate(&tid2, + "running thread 2", + test_thread2, + (uint32 *)wa_test2, + sizeof wa_test2, + TASKS_BASE_PRIORITY - 2, + 0); + test_assert(err == OS_SUCCESS, "task 2 creation failed"); + + err = OS_TaskCreate(&tid3, + "running thread 3", + test_thread3, + (uint32 *)wa_test3, + sizeof wa_test3, + TASKS_BASE_PRIORITY - 1, + 0); + test_assert(err == OS_SUCCESS, "task 3 creation failed"); + + err = OS_TaskCreate(&tid4, + "running thread 4", + test_thread4, + (uint32 *)wa_test4, + sizeof wa_test4, + TASKS_BASE_PRIORITY - 0, + 0); + test_assert(err == OS_SUCCESS, "task 4 creation failed"); + } + + /* Tasks are made runnable atomically and their execution order tested.*/ + test_set_step(4); + { + OS_TaskDelay(5); + test_assert_sequence("ABCD", "task order violation"); + } + + /* Tasks are created in an not ordered way.*/ + test_set_step(5); + { + int32 err; + uint32 tid1, tid2, tid3, tid4; + + err = OS_TaskCreate(&tid2, + "running thread 2", + test_thread2, + (uint32 *)wa_test2, + sizeof wa_test2, + TASKS_BASE_PRIORITY - 2, + 0); + test_assert(err == OS_SUCCESS, "task 2 creation failed"); + + err = OS_TaskCreate(&tid1, + "running thread 1", + test_thread1, + (uint32 *)wa_test1, + sizeof wa_test1, + TASKS_BASE_PRIORITY - 3, + 0); + test_assert(err == OS_SUCCESS, "task 1 creation failed"); + + err = OS_TaskCreate(&tid4, + "running thread 4", + test_thread4, + (uint32 *)wa_test4, + sizeof wa_test4, + TASKS_BASE_PRIORITY - 0, + 0); + test_assert(err == OS_SUCCESS, "task 4 creation failed"); + + err = OS_TaskCreate(&tid3, + "running thread 3", + test_thread3, + (uint32 *)wa_test3, + sizeof wa_test3, + TASKS_BASE_PRIORITY - 1, + 0); + test_assert(err == OS_SUCCESS, "task 3 creation failed"); + } + + /* Tasks are made runnable atomically and their execution order tested.*/ + test_set_step(6); + { + OS_TaskDelay(5); + test_assert_sequence("ABCD", "task order violation"); + } +} + +static const testcase_t test_001_002 = { + "OS_TaskCreate() priority ordering", + NULL, + NULL, + test_001_002_execute +}; +#endif /* TRUE */ + +/**************************************************************************** + * Exported data. + ****************************************************************************/ + +/** + * @brief Sequence brief description. + */ +const testcase_t * const test_sequence_001[] = { +#if TRUE || defined(__DOXYGEN__) + &test_001_001, +#endif +#if TRUE || defined(__DOXYGEN__) + &test_001_002, +#endif + NULL +}; diff --git a/test/nasa_osal/test_sequence_001.h b/test/nasa_osal/test_sequence_001.h new file mode 100644 index 000000000..91c2181d0 --- /dev/null +++ b/test/nasa_osal/test_sequence_001.h @@ -0,0 +1,22 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _TEST_SEQUENCE_001_H_ +#define _TEST_SEQUENCE_001_H_ + +extern const testcase_t * const test_sequence_001[]; + +#endif /* _TEST_SEQUENCE_001_H_ */ -- cgit v1.2.3