2016-03-06 03:59:44 -08:00
<?xml version="1.0" encoding="UTF-8"?>
<SPC5-Config version= "1.0.0" >
<application name= "Test Suite" version= "1.0.0" standalone= "true" locked= "false" >
<description > Test specification for the NASA OSAL ChibiOS extension.</description>
<component id= "org.chibios.spc5.components.platform.generic" >
<component id= "org.chibios.spc5.components.chibios_unitary_tests_engine" />
</component>
<instances >
<instance locked= "false" id= "org.chibios.spc5.components.platform.generic" />
<instance locked= "false" id= "org.chibios.spc5.components.chibios_unitary_tests_engine" >
<description >
<introduction >
2016-03-08 00:38:54 -08:00
<value > Test suite for NASA OSAL implementation over ChibiOS/RT. The purpose of this suite is to perform unit tests on the OSAL module and to converge to 100% code coverage through successive improvements.</value>
2016-03-06 03:59:44 -08:00
</introduction>
</description>
<global_data_and_code >
<global_definitions >
<value > < ![CDATA[#define TEST_SUITE_NAME "NASA OSAL over ChibiOS/RT Test Suite"
#define TASKS_BASE_PRIORITY 200
#define TASKS_STACK_SIZE 256
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);]]></value>
</global_definitions>
<global_code >
<value > < ![CDATA[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);]]></value>
</global_code>
</global_data_and_code>
<sequences >
<sequence >
<type index= "0" >
<value > Internal Tests</value>
</type>
<brief >
<value > Threads Functionality</value>
</brief>
<description >
<value > This sequence tests the NASA OSAL over ChibiOS/RT functionalities related to threading.</value>
</description>
<shared_code >
2016-03-08 01:30:01 -08:00
<value > < ![CDATA[#include "osapi.h"
2016-03-06 03:59:44 -08:00
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');
}
2016-03-08 01:30:01 -08:00
static void test_thread4(void) {
test_emit_token('D');
2016-03-08 00:38:54 -08:00
}
2016-03-06 03:59:44 -08:00
2016-03-08 01:30:01 -08:00
static void delete_handler(void) {
test_emit_token('C');
}
static void test_thread_delete(void) {
test_emit_token('A');
(void) OS_TaskInstallDeleteHandler(delete_handler);
2016-03-08 00:38:54 -08:00
while (!OS_TaskDeleteCheck()) {
2016-03-08 01:30:01 -08:00
(void) OS_TaskDelay(1);
}
test_emit_token('B');
2016-03-06 03:59:44 -08:00
}]]></value>
</shared_code>
<cases >
<case >
<brief >
<value > OS_TaskCreate() errors</value>
</brief>
<description >
<value > Parameters checking in OS_TaskCreate() is tested.</value>
</description>
<condition >
<value />
</condition>
<various_code >
<setup_code >
<value />
</setup_code>
<teardown_code >
<value />
</teardown_code>
<local_variables >
<value />
</local_variables>
</various_code>
<steps >
<step >
<description >
<value > OS_TaskCreate() is invoked with task_id set to NULL, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[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");]]></value>
</code>
</step>
<step >
<description >
<value > OS_TaskCreate() is invoked with task_name set to NULL, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[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");]]></value>
</code>
</step>
<step >
<description >
<value > OS_TaskCreate() is invoked with stack_pointer set to NULL, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[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");]]></value>
</code>
</step>
<step >
<description >
<value > OS_TaskCreate() is invoked with a very long task name, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[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");]]></value>
</code>
</step>
<step >
<description >
<value > OS_TaskCreate() is invoked with priority below and above allowed range, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[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");]]></value>
</code>
</step>
<step >
<description >
<value > OS_TaskCreate() is invoked with a stack size below minimum, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[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");]]></value>
</code>
</step>
<step >
<description >
<value > OS_TaskCreate() is invoked twice with duplicated name and then duplicated stack, an error is expected in both cases.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[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,
2016-03-07 05:11:20 -08:00
"conflicting thread",
2016-03-06 03:59:44 -08:00
test_thread1,
(uint32 *)wa_test1,
sizeof wa_test1,
TASKS_BASE_PRIORITY,
0);
test_assert(err == OS_ERR_NO_FREE_IDS, "stack conflict not detected");
2016-03-09 08:06:50 -08:00
err = OS_TaskWait(tid);
test_assert(err == OS_SUCCESS, "wait failed");
2016-03-06 03:59:44 -08:00
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");
2016-03-09 08:06:50 -08:00
err = OS_TaskWait(tid);
test_assert(err == OS_SUCCESS, "wait failed");
2016-03-06 03:59:44 -08:00
test_assert_sequence("A", "task not executed");]]></value>
</code>
</step>
</steps>
</case>
2016-03-06 04:12:41 -08:00
<case >
<brief >
<value > OS_TaskCreate() priority ordering</value>
</brief>
<description >
<value > Four tasks are created at different priorities and in different order. The execution order must happen in order of priority regardless the creation order.</value>
</description>
<condition >
<value />
</condition>
<various_code >
<setup_code >
<value />
</setup_code>
<teardown_code >
<value />
</teardown_code>
<local_variables >
<value />
</local_variables>
</various_code>
<steps >
<step >
<description >
<value > Four tasks are created in priority order from low to high.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-07 05:11:20 -08:00
<value > < ![CDATA[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);
2016-03-06 04:12:41 -08:00
test_assert(err == OS_SUCCESS, "task 1 creation failed");]]></value>
</code>
</step>
<step >
<description >
<value > Tasks are made runnable atomically and their execution order tested.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-07 05:11:20 -08:00
<value > < ![CDATA[OS_TaskDelay(5);
2016-03-06 04:12:41 -08:00
test_assert_sequence("ABCD", "task order violation");]]></value>
</code>
</step>
<step >
<description >
<value > Four tasks are created in priority order from high to low.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-07 05:11:20 -08:00
<value > < ![CDATA[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);
2016-03-06 04:12:41 -08:00
test_assert(err == OS_SUCCESS, "task 4 creation failed");]]></value>
</code>
</step>
<step >
<description >
<value > Tasks are made runnable atomically and their execution order tested.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-07 05:11:20 -08:00
<value > < ![CDATA[OS_TaskDelay(5);
2016-03-06 04:12:41 -08:00
test_assert_sequence("ABCD", "task order violation");]]></value>
</code>
</step>
<step >
<description >
<value > Four tasks are created in an not ordered way.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-07 05:11:20 -08:00
<value > < ![CDATA[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);
2016-03-06 04:12:41 -08:00
test_assert(err == OS_SUCCESS, "task 3 creation failed");]]></value>
</code>
</step>
<step >
<description >
<value > Tasks are made runnable atomically and their execution order tested.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-07 05:11:20 -08:00
<value > < ![CDATA[OS_TaskDelay(5);
2016-03-06 04:12:41 -08:00
test_assert_sequence("ABCD", "task order violation");]]></value>
</code>
</step>
</steps>
</case>
2016-03-08 00:38:54 -08:00
<case >
<brief >
<value > OS_TaskDelete() errors</value>
</brief>
<description >
<value > Parameters checking in OS_TaskDelete() is tested.</value>
</description>
<condition >
<value />
</condition>
<various_code >
<setup_code >
<value />
</setup_code>
<teardown_code >
<value />
</teardown_code>
<local_variables >
<value />
</local_variables>
</various_code>
<steps >
<step >
<description >
<value > OS_TaskDelete() is invoked with task_id set to -1, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-08 01:30:01 -08:00
<value > < ![CDATA[int32 err;
err = OS_TaskDelete((uint32)-1);
2016-03-08 00:38:54 -08:00
test_assert(err == OS_ERR_INVALID_ID, "wrong task id not detected");]]></value>
</code>
</step>
</steps>
</case>
<case >
<brief >
<value > OS_TaskDelete() and OS_TaskInstallDeleteHandler() functionality</value>
</brief>
<description >
<value > OS_TaskDelete() and OS_TaskInstallDeleteHandler() are tested for functionality.</value>
</description>
<condition >
<value />
</condition>
<various_code >
<setup_code >
<value />
</setup_code>
<teardown_code >
<value />
</teardown_code>
<local_variables >
2016-03-08 01:30:01 -08:00
<value > <![CDATA[uint32 tid;]]> </value>
2016-03-08 00:38:54 -08:00
</local_variables>
</various_code>
2016-03-08 01:30:01 -08:00
<steps >
<step >
<description >
<value > Creating a task executing an infinite loop.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[int32 err;
err = OS_TaskCreate(& tid,
"deletable thread",
test_thread_delete,
(uint32 *)wa_test1,
sizeof wa_test1,
TASKS_BASE_PRIORITY,
0);
test_assert(err == OS_SUCCESS, "deletable task creation failed");]]></value>
</code>
</step>
<step >
<description >
<value > Letting the task run for a while then deleting it. A check is performed on the correct execution of the delete handler.</value>
</description>
<tags >
<value />
</tags>
2016-03-09 06:35:51 -08:00
<code >
<value > < ![CDATA[int32 err;
(void) OS_TaskDelay(50);
err = OS_TaskDelete(tid);
test_assert(err == OS_SUCCESS, "delete failed");
test_assert_sequence("ABC", "events order violation");]]></value>
</code>
</step>
</steps>
</case>
</cases>
</sequence>
<sequence >
<type index= "0" >
<value > Internal Tests</value>
</type>
<brief >
2016-03-09 07:45:58 -08:00
<value > Queues Functionality</value>
2016-03-09 06:35:51 -08:00
</brief>
<description >
<value > This sequence tests the NASA OSAL over ChibiOS/RT functionalities related to queues</value>
</description>
<shared_code >
2016-03-09 08:06:50 -08:00
<value > <![CDATA[#include <string.h>
2016-03-09 07:45:58 -08:00
#include "osapi.h"
2016-03-09 08:06:50 -08:00
uint32 qid, tid;
2016-03-09 07:45:58 -08:00
2016-03-09 08:06:50 -08:00
#define WRITER_NUM_MESSAGES 16
2016-03-09 07:45:58 -08:00
#define MESSAGE_SIZE 20
static void test_task_writer(void) {
unsigned i;
int32 err;
for (i = 0; i < WRITER_NUM_MESSAGES ; i + + ) {
err = OS_QueuePut(qid, "Hello World", 12, 0);
if (err != OS_SUCCESS) {
test_emit_token('*');
}
}
}]]></value>
2016-03-09 06:35:51 -08:00
</shared_code>
<cases >
<case >
<brief >
<value > OS_QueueCreate() and OS_QueueDelete() errors</value>
</brief>
<description >
<value > Parameters checking in OS_QueueCreate() and OS_QueueDelete() is tested.</value>
</description>
<condition >
<value />
</condition>
<various_code >
<setup_code >
<value />
</setup_code>
<teardown_code >
<value />
</teardown_code>
<local_variables >
<value />
</local_variables>
</various_code>
<steps >
<step >
<description >
<value > OS_QueueCreate() is invoked with queue_id set to NULL, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[int32 err;
err = OS_QueueCreate(NULL, /* Error.*/
"failing queue",
4,
128,
0);
test_assert(err == OS_INVALID_POINTER, "NULL not detected");]]></value>
</code>
</step>
<step >
<description >
<value > OS_QueueCreate() is invoked with task_name set to NULL, an error is expected.</value>
</description>
<tags >
<value />
</tags>
2016-03-08 01:30:01 -08:00
<code >
2016-03-09 07:45:58 -08:00
<value > < ![CDATA[int32 err;
uint32 qid;
err = OS_QueueCreate(& qid,
NULL, /* Error.*/
4,
128,
0);
2016-03-09 06:35:51 -08:00
test_assert(err == OS_INVALID_POINTER, "NULL not detected");]]></value>
</code>
</step>
<step >
<description >
<value > OS_QueueCreate() is invoked with a very long task name, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-09 07:45:58 -08:00
<value > < ![CDATA[int32 err;
uint32 qid;
err = OS_QueueCreate(& qid,
"very very long queue name", /* Error.*/
4,
128,
0);
2016-03-09 06:35:51 -08:00
test_assert(err == OS_ERR_NAME_TOO_LONG, "name limit not detected");]]></value>
</code>
</step>
<step >
<description >
<value > OS_QueueDelete() is invoked with queue_id set to -1, an error is expected.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[int32 err;
err = OS_QueueDelete((uint32)-1);
test_assert(err == OS_ERR_INVALID_ID, "wrong queue id not detected");]]></value>
</code>
</step>
<step >
<description >
<value > OS_QueueCreate() is invoked twice with duplicated name, an error is expected, then the queue is deleted using OS_DeleteQueue().</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[int32 err;
uint32 qid1, qid2;
err = OS_QueueCreate(& qid1, "my queue", 4, 128, 0);
test_assert(err == OS_SUCCESS, "queue creation failed");
err = OS_QueueCreate(& qid2, "my queue", 4, 128, 0);
test_assert(err == OS_ERR_NAME_TAKEN, "name conflict not detected");
err = OS_QueueDelete(qid1);
test_assert(err == OS_SUCCESS, "queue deletion failed");]]></value>
2016-03-08 01:30:01 -08:00
</code>
</step>
</steps>
2016-03-08 00:38:54 -08:00
</case>
2016-03-09 07:45:58 -08:00
<case >
<brief >
<value > OS_QueuePut() and OS_QueueGet() functionality</value>
</brief>
<description >
<value > A task writes on a queue, the messages are retrieved on the other side in blocking mode.</value>
</description>
<condition >
<value />
</condition>
<various_code >
<setup_code >
2016-03-09 08:06:50 -08:00
<value > < ![CDATA[qid = 0;
tid = 0;]]></value>
2016-03-09 07:45:58 -08:00
</setup_code>
<teardown_code >
2016-03-09 08:06:50 -08:00
<value > < ![CDATA[if (qid != 0) {
(void) OS_QueueDelete(qid);
}
if (tid != 0) {
(void) OS_TaskWait(tid);
2016-03-09 07:45:58 -08:00
}]]></value>
</teardown_code>
<local_variables >
2016-03-09 08:06:50 -08:00
<value > < ![CDATA[uint32 tid;
2016-03-09 07:45:58 -08:00
unsigned i;]]></value>
</local_variables>
</various_code>
<steps >
<step >
<description >
<value > Creataing a queue with depth 4 and message size 20</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[int32 err;
err = OS_QueueCreate(& qid, "test queue", 4, MESSAGE_SIZE, 0);
test_assert(err == OS_SUCCESS, "queue creation failed");]]></value>
</code>
</step>
<step >
<description >
<value > Creating the writer task.</value>
</description>
<tags >
<value />
</tags>
<code >
<value > < ![CDATA[int32 err;
err = OS_TaskCreate(& tid,
"writer task",
test_task_writer,
(uint32 *)wa_test1,
sizeof wa_test1,
TASKS_BASE_PRIORITY,
0);
test_assert(err == OS_SUCCESS, "writer task creation failed");]]></value>
</code>
</step>
<step >
<description >
<value > Reading messages from the writer task.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-09 08:06:50 -08:00
<value > < ![CDATA[for (i = 0; i < WRITER_NUM_MESSAGES ; i + + ) {
int32 err;
char data[MESSAGE_SIZE];
uint32 copied;
err = OS_QueueGet(qid, data, MESSAGE_SIZE, & copied, OS_Milli2Ticks(200));
test_assert(err == OS_SUCCESS, "timed out");
test_assert(strncmp(data, "Hello World", sizeof (data)) == 0,
"wrong message");
2016-03-09 07:45:58 -08:00
}]]></value>
</code>
</step>
<step >
<description >
<value > Waiting for task termination then checking for errors.</value>
</description>
<tags >
<value />
</tags>
<code >
2016-03-09 08:06:50 -08:00
<value > < ![CDATA[(void) OS_TaskWait(tid);
tid = 0;
2016-03-09 07:45:58 -08:00
test_assert_sequence("", "queue write errors occurred");]]></value>
</code>
</step>
</steps>
</case>
2016-03-06 03:59:44 -08:00
</cases>
</sequence>
</sequences>
</instance>
</instances>
<exportedFeatures />
</application>
</SPC5-Config>