aboutsummaryrefslogtreecommitdiffstats
path: root/test/rt/source/test/rt_test_sequence_004.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/rt/source/test/rt_test_sequence_004.c')
-rw-r--r--test/rt/source/test/rt_test_sequence_004.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/test/rt/source/test/rt_test_sequence_004.c b/test/rt/source/test/rt_test_sequence_004.c
new file mode 100644
index 000000000..0b1e8646a
--- /dev/null
+++ b/test/rt/source/test/rt_test_sequence_004.c
@@ -0,0 +1,130 @@
+/*
+ ChibiOS - Copyright (C) 2006..2017 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 "rt_test_root.h"
+
+/**
+ * @file rt_test_sequence_004.c
+ * @brief Test Sequence 004 code.
+ *
+ * @page rt_test_sequence_004 [4] Suspend/Resume
+ *
+ * File: @ref rt_test_sequence_004.c
+ *
+ * <h2>Description</h2>
+ * This sequence tests the ChibiOS/RT functionalities related to
+ * threads suspend/resume.
+ *
+ * <h2>Test Cases</h2>
+ * - @subpage rt_test_004_001
+ * .
+ */
+
+/****************************************************************************
+ * Shared code.
+ ****************************************************************************/
+
+static thread_reference_t tr1;
+
+static THD_FUNCTION(thread1, p) {
+
+ chSysLock();
+ chThdResumeI(&tr1, MSG_OK);
+ chSchRescheduleS();
+ chSysUnlock();
+ test_emit_token(*(char *)p);
+}
+
+/****************************************************************************
+ * Test cases.
+ ****************************************************************************/
+
+/**
+ * @page rt_test_004_001 [4.1] Suspend and Resume functionality
+ *
+ * <h2>Description</h2>
+ * The functionality of chThdSuspendTimeoutS() and chThdResumeI() is
+ * tested.
+ *
+ * <h2>Test Steps</h2>
+ * - [4.1.1] The function chThdSuspendTimeoutS() is invoked, the thread
+ * is remotely resumed with message @p MSG_OK. On return the message
+ * and the state of the reference are tested.
+ * - [4.1.2] The function chThdSuspendTimeoutS() is invoked, the thread
+ * is not resumed so a timeout must occur. On return the message and
+ * the state of the reference are tested.
+ * .
+ */
+
+static void rt_test_004_001_setup(void) {
+ tr1 = NULL;
+}
+
+static void rt_test_004_001_execute(void) {
+ systime_t time;
+ msg_t msg;
+
+ /* [4.1.1] The function chThdSuspendTimeoutS() is invoked, the thread
+ is remotely resumed with message @p MSG_OK. On return the message
+ and the state of the reference are tested.*/
+ test_set_step(1);
+ {
+ threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()-1, thread1, "A");
+ chSysLock();
+ msg = chThdSuspendTimeoutS(&tr1, TIME_INFINITE);
+ chSysUnlock();
+ test_assert(NULL == tr1, "not NULL");
+ test_assert(MSG_OK == msg,"wrong returned message");
+ test_wait_threads();
+ }
+
+ /* [4.1.2] The function chThdSuspendTimeoutS() is invoked, the thread
+ is not resumed so a timeout must occur. On return the message and
+ the state of the reference are tested.*/
+ test_set_step(2);
+ {
+ chSysLock();
+ time = chVTGetSystemTimeX();
+ msg = chThdSuspendTimeoutS(&tr1, TIME_MS2I(1000));
+ chSysUnlock();
+ test_assert_time_window(time + TIME_MS2I(1000),
+ time + TIME_MS2I(1000) + CH_CFG_ST_TIMEDELTA + 1,
+ "out of time window");
+ test_assert(NULL == tr1, "not NULL");
+ test_assert(MSG_TIMEOUT == msg, "wrong returned message");
+ }
+}
+
+static const testcase_t rt_test_004_001 = {
+ "Suspend and Resume functionality",
+ rt_test_004_001_setup,
+ NULL,
+ rt_test_004_001_execute
+};
+
+/****************************************************************************
+ * Exported data.
+ ****************************************************************************/
+
+/**
+ * @brief Suspend/Resume.
+ */
+const testcase_t * const rt_test_sequence_004[] = {
+ &rt_test_004_001,
+ NULL
+};