diff options
-rw-r--r-- | os/common/abstractions/nasa_osal/include/osapi-os-custom.h | 1 | ||||
-rw-r--r-- | os/common/abstractions/nasa_osal/src/osapi.c | 22 | ||||
-rw-r--r-- | test/nasa_osal/configuration.xml | 48 | ||||
-rw-r--r-- | test/nasa_osal/source/test/test_sequence_001.c | 6 | ||||
-rw-r--r-- | test/nasa_osal/source/test/test_sequence_002.c | 267 | ||||
-rw-r--r-- | test/nasa_osal/source/test/test_sequence_002.h | 17 |
6 files changed, 339 insertions, 22 deletions
diff --git a/os/common/abstractions/nasa_osal/include/osapi-os-custom.h b/os/common/abstractions/nasa_osal/include/osapi-os-custom.h index dffe97c6d..34b63322e 100644 --- a/os/common/abstractions/nasa_osal/include/osapi-os-custom.h +++ b/os/common/abstractions/nasa_osal/include/osapi-os-custom.h @@ -54,6 +54,7 @@ extern "C" { #endif
void OS_set_printf(int (*printf)(const char *fmt, ...));
boolean OS_TaskDeleteCheck(void);
+ int32 OS_TaskWait(uint32 task_id);
#ifdef __cplusplus
}
#endif
diff --git a/os/common/abstractions/nasa_osal/src/osapi.c b/os/common/abstractions/nasa_osal/src/osapi.c index 685c936b6..4dc39969d 100644 --- a/os/common/abstractions/nasa_osal/src/osapi.c +++ b/os/common/abstractions/nasa_osal/src/osapi.c @@ -1912,6 +1912,28 @@ void OS_TaskExit(void) { }
/**
+ * @brief Wait for task termination.
+ * @note This is a ChibiOS/RT extension, added for improved testability.
+ *
+ * @param[in] task_id the task id
+ * @return An error code.
+ *
+ * @api
+ */
+int32 OS_TaskWait(uint32 task_id) {
+ thread_t *tp = (thread_t *)task_id;
+
+ /* Check for thread validity, getting a reference.*/
+ if (chRegFindThreadByPointer(tp) == NULL) {
+ return OS_ERR_INVALID_ID;
+ }
+
+ (void) chThdWait(tp);
+
+ return OS_SUCCESS;
+}
+
+/**
* @brief Task delay.
*
* @param[in] milli_second the period in miliseconds
diff --git a/test/nasa_osal/configuration.xml b/test/nasa_osal/configuration.xml index 0d628e57f..aae9b72df 100644 --- a/test/nasa_osal/configuration.xml +++ b/test/nasa_osal/configuration.xml @@ -283,7 +283,8 @@ err = OS_TaskCreate(&tid, 0); test_assert(err == OS_ERR_NO_FREE_IDS, "stack conflict not detected"); -OS_TaskDelay(5); +err = OS_TaskWait(tid); +test_assert(err == OS_SUCCESS, "wait failed"); test_assert_sequence("A", "task not executed"); err = OS_TaskCreate(&tid, @@ -295,7 +296,8 @@ err = OS_TaskCreate(&tid, 0); test_assert(err == OS_SUCCESS, "task creation failed"); -OS_TaskDelay(5); +err = OS_TaskWait(tid); +test_assert(err == OS_SUCCESS, "wait failed"); test_assert_sequence("A", "task not executed");]]></value>
</code>
</step>
@@ -616,13 +618,13 @@ test_assert_sequence("ABC", "events order violation");]]></value> <value>This sequence tests the NASA OSAL over ChibiOS/RT functionalities related to queues</value>
</description>
<shared_code>
- <value><![CDATA[#include <string.h>
-
+ <value><![CDATA[#include <string.h> + #include "osapi.h" -uint32 qid; +uint32 qid, tid; -#define WRITER_NUM_MESSAGES 16
+#define WRITER_NUM_MESSAGES 16 #define MESSAGE_SIZE 20 static void test_task_writer(void) { @@ -765,15 +767,20 @@ test_assert(err == OS_SUCCESS, "queue deletion failed");]]></value> </condition>
<various_code>
<setup_code>
- <value><![CDATA[qid = 0;]]></value>
+ <value><![CDATA[qid = 0;
+tid = 0;]]></value>
</setup_code>
<teardown_code>
- <value><![CDATA[if (qid != 0) {
- (void) OS_QueueDelete(qid);
+ <value><![CDATA[if (qid != 0) { + (void) OS_QueueDelete(qid); +} + +if (tid != 0) { + (void) OS_TaskWait(tid); }]]></value>
</teardown_code>
<local_variables>
- <value><![CDATA[uint32 tid;
+ <value><![CDATA[uint32 tid; unsigned i;]]></value>
</local_variables>
</various_code>
@@ -820,15 +827,15 @@ test_assert(err == OS_SUCCESS, "writer task creation failed");]]></value> <value />
</tags>
<code>
- <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");
+ <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"); }]]></value>
</code>
</step>
@@ -840,7 +847,8 @@ test_assert(err == OS_SUCCESS, "writer task creation failed");]]></value> <value />
</tags>
<code>
- <value><![CDATA[OS_TaskDelay(10);
+ <value><![CDATA[(void) OS_TaskWait(tid); +tid = 0; test_assert_sequence("", "queue write errors occurred");]]></value>
</code>
</step>
diff --git a/test/nasa_osal/source/test/test_sequence_001.c b/test/nasa_osal/source/test/test_sequence_001.c index f8081cde1..de643b95e 100644 --- a/test/nasa_osal/source/test/test_sequence_001.c +++ b/test/nasa_osal/source/test/test_sequence_001.c @@ -257,7 +257,8 @@ static void test_001_001_execute(void) { 0);
test_assert(err == OS_ERR_NO_FREE_IDS, "stack conflict not detected");
- OS_TaskDelay(5);
+ err = OS_TaskWait(tid);
+ test_assert(err == OS_SUCCESS, "wait failed");
test_assert_sequence("A", "task not executed");
err = OS_TaskCreate(&tid,
@@ -269,7 +270,8 @@ static void test_001_001_execute(void) { 0);
test_assert(err == OS_SUCCESS, "task creation failed");
- OS_TaskDelay(5);
+ err = OS_TaskWait(tid);
+ test_assert(err == OS_SUCCESS, "wait failed");
test_assert_sequence("A", "task not executed");
}
}
diff --git a/test/nasa_osal/source/test/test_sequence_002.c b/test/nasa_osal/source/test/test_sequence_002.c new file mode 100644 index 000000000..4b9da0522 --- /dev/null +++ b/test/nasa_osal/source/test/test_sequence_002.c @@ -0,0 +1,267 @@ +/*
+ 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_test.h"
+#include "test_root.h"
+
+/**
+ * @page test_sequence_002 Queues Functionality
+ *
+ * File: @ref test_sequence_002.c
+ *
+ * <h2>Description</h2>
+ * This sequence tests the NASA OSAL over ChibiOS/RT functionalities
+ * related to queues.
+ *
+ * <h2>Test Cases</h2>
+ * - @subpage test_002_001
+ * - @subpage test_002_002
+ * .
+ */
+
+/****************************************************************************
+ * Shared code.
+ ****************************************************************************/
+
+#include <string.h> + +#include "osapi.h" + +uint32 qid, tid; + +#define WRITER_NUM_MESSAGES 16 +#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('*'); + } + } +}
+
+/****************************************************************************
+ * Test cases.
+ ****************************************************************************/
+
+/**
+ * @page test_002_001 OS_QueueCreate() and OS_QueueDelete() errors
+ *
+ * <h2>Description</h2>
+ * Parameters checking in OS_QueueCreate() and OS_QueueDelete() is
+ * tested.
+ *
+ * <h2>Test Steps</h2>
+ * - OS_QueueCreate() is invoked with queue_id set to NULL, an error is
+ * expected.
+ * - OS_QueueCreate() is invoked with task_name set to NULL, an error
+ * is expected.
+ * - OS_QueueCreate() is invoked with a very long task name, an error
+ * is expected.
+ * - OS_QueueDelete() is invoked with queue_id set to -1, an error is
+ * expected.
+ * - OS_QueueCreate() is invoked twice with duplicated name, an error
+ * is expected, then the queue is deleted using OS_DeleteQueue().
+ * .
+ */
+
+static void test_002_001_execute(void) {
+
+ /* OS_QueueCreate() is invoked with queue_id set to NULL, an error is
+ expected.*/
+ test_set_step(1);
+ {
+ int32 err;
+
+ err = OS_QueueCreate(NULL, /* Error.*/
+ "failing queue",
+ 4,
+ 128,
+ 0);
+ test_assert(err == OS_INVALID_POINTER, "NULL not detected");
+ }
+
+ /* OS_QueueCreate() is invoked with task_name set to NULL, an error
+ is expected.*/
+ test_set_step(2);
+ {
+ int32 err;
+ uint32 qid;
+
+ err = OS_QueueCreate(&qid,
+ NULL, /* Error.*/
+ 4,
+ 128,
+ 0);
+ test_assert(err == OS_INVALID_POINTER, "NULL not detected");
+ }
+
+ /* OS_QueueCreate() is invoked with a very long task name, an error
+ is expected.*/
+ test_set_step(3);
+ {
+ int32 err;
+ uint32 qid;
+
+ err = OS_QueueCreate(&qid,
+ "very very long queue name", /* Error.*/
+ 4,
+ 128,
+ 0);
+ test_assert(err == OS_ERR_NAME_TOO_LONG, "name limit not detected");
+ }
+
+ /* OS_QueueDelete() is invoked with queue_id set to -1, an error is
+ expected.*/
+ test_set_step(4);
+ {
+ int32 err;
+
+ err = OS_QueueDelete((uint32)-1);
+ test_assert(err == OS_ERR_INVALID_ID, "wrong queue id not detected");
+ }
+
+ /* OS_QueueCreate() is invoked twice with duplicated name, an error
+ is expected, then the queue is deleted using OS_DeleteQueue().*/
+ test_set_step(5);
+ {
+ 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");
+ }
+}
+
+static const testcase_t test_002_001 = {
+ "OS_QueueCreate() and OS_QueueDelete() errors",
+ NULL,
+ NULL,
+ test_002_001_execute
+};
+
+/**
+ * @page test_002_002 OS_QueuePut() and OS_QueueGet() functionality
+ *
+ * <h2>Description</h2>
+ * A task writes on a queue, the messages are retrieved on the other
+ * side in blocking mode.
+ *
+ * <h2>Test Steps</h2>
+ * - Creataing a queue with depth 4 and message size 20.
+ * - Creating the writer task.
+ * - Reading messages from the writer task.
+ * - Waiting for task termination then checking for errors.
+ * .
+ */
+
+static void test_002_002_setup(void) {
+ qid = 0;
+ tid = 0;
+}
+
+static void test_002_002_teardown(void) {
+ if (qid != 0) {
+ (void) OS_QueueDelete(qid);
+ }
+
+ if (tid != 0) {
+ (void) OS_TaskWait(tid);
+ }
+}
+
+static void test_002_002_execute(void) {
+ uint32 tid;
+ unsigned i;
+
+ /* Creataing a queue with depth 4 and message size 20.*/
+ test_set_step(1);
+ {
+ int32 err;
+
+ err = OS_QueueCreate(&qid, "test queue", 4, MESSAGE_SIZE, 0);
+ test_assert(err == OS_SUCCESS, "queue creation failed");
+ }
+
+ /* Creating the writer task.*/
+ test_set_step(2);
+ {
+ 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");
+ }
+
+ /* Reading messages from the writer task.*/
+ test_set_step(3);
+ {
+ 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");
+ }
+ }
+
+ /* Waiting for task termination then checking for errors.*/
+ test_set_step(4);
+ {
+ (void) OS_TaskWait(tid);
+ tid = 0;
+ test_assert_sequence("", "queue write errors occurred");
+ }
+}
+
+static const testcase_t test_002_002 = {
+ "OS_QueuePut() and OS_QueueGet() functionality",
+ test_002_002_setup,
+ test_002_002_teardown,
+ test_002_002_execute
+};
+
+/****************************************************************************
+ * Exported data.
+ ****************************************************************************/
+
+/**
+ * @brief Queues Functionality.
+ */
+const testcase_t * const test_sequence_002[] = {
+ &test_002_001,
+ &test_002_002,
+ NULL
+};
diff --git a/test/nasa_osal/source/test/test_sequence_002.h b/test/nasa_osal/source/test/test_sequence_002.h new file mode 100644 index 000000000..bd7b6c764 --- /dev/null +++ b/test/nasa_osal/source/test/test_sequence_002.h @@ -0,0 +1,17 @@ +/*
+ 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.
+*/
+
+extern const testcase_t * const test_sequence_002[];
|