summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Butterfield <Andrew.Butterfield@scss.tcd.ie>2021-12-08 17:13:53 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2022-05-18 11:36:06 +0200
commit82e53d2ae5f6b6c3022672fd91f9ee50200248da (patch)
tree2b7fd0da6f448dc629b25e2c29a5068d3996a95d
parent64ff5f07cf13ecc272f3bb8612e10fda832c7fcf (diff)
validation: Add tests derived from models
-rw-r--r--spec/build/testsuites/validation/grp.yml2
-rw-r--r--spec/build/testsuites/validation/model-0.yml53
-rw-r--r--testsuites/validation/tc-event-mgr-model.c358
-rw-r--r--testsuites/validation/tr-chains-api-model-0.c165
-rw-r--r--testsuites/validation/tr-chains-api-model-1.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-10.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-11.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-12.c169
-rw-r--r--testsuites/validation/tr-chains-api-model-13.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-14.c169
-rw-r--r--testsuites/validation/tr-chains-api-model-15.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-16.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-17.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-18.c169
-rw-r--r--testsuites/validation/tr-chains-api-model-19.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-2.c165
-rw-r--r--testsuites/validation/tr-chains-api-model-20.c169
-rw-r--r--testsuites/validation/tr-chains-api-model-3.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-4.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-5.c169
-rw-r--r--testsuites/validation/tr-chains-api-model-6.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-7.c169
-rw-r--r--testsuites/validation/tr-chains-api-model-8.c167
-rw-r--r--testsuites/validation/tr-chains-api-model-9.c165
-rw-r--r--testsuites/validation/tr-chains-api-model.c68
-rw-r--r--testsuites/validation/tr-chains-api-model.h55
-rw-r--r--testsuites/validation/tr-event-mgr-model-0.c344
-rw-r--r--testsuites/validation/tr-event-mgr-model-1.c342
-rw-r--r--testsuites/validation/tr-event-mgr-model-2.c355
-rw-r--r--testsuites/validation/tr-event-mgr-model-3.c340
-rw-r--r--testsuites/validation/tr-event-mgr-model-4.c361
-rw-r--r--testsuites/validation/tr-event-mgr-model-5.c361
-rw-r--r--testsuites/validation/tr-event-mgr-model-6.c383
-rw-r--r--testsuites/validation/tr-event-mgr-model-7.c388
-rw-r--r--testsuites/validation/tr-event-mgr-model-8.c375
-rw-r--r--testsuites/validation/tr-event-mgr-model.c257
-rw-r--r--testsuites/validation/tr-event-mgr-model.h235
-rw-r--r--testsuites/validation/ts-model-0.c78
38 files changed, 7868 insertions, 0 deletions
diff --git a/spec/build/testsuites/validation/grp.yml b/spec/build/testsuites/validation/grp.yml
index 1598a37db0..5a66e7fa22 100644
--- a/spec/build/testsuites/validation/grp.yml
+++ b/spec/build/testsuites/validation/grp.yml
@@ -43,6 +43,8 @@ links:
- role: build-dependency
uid: fatal-too-large-tls-size
- role: build-dependency
+ uid: model-0
+- role: build-dependency
uid: performance-no-clock-0
- role: build-dependency
uid: terminate
diff --git a/spec/build/testsuites/validation/model-0.yml b/spec/build/testsuites/validation/model-0.yml
new file mode 100644
index 0000000000..2b865b4d6f
--- /dev/null
+++ b/spec/build/testsuites/validation/model-0.yml
@@ -0,0 +1,53 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+build-type: test-program
+cflags: []
+copyrights:
+- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+cppflags: []
+cxxflags: []
+enabled-by: RTEMS_SMP
+features: c cprogram
+includes: []
+ldflags: []
+links: []
+source:
+- testsuites/validation/tc-event-mgr-model.c
+- testsuites/validation/tr-chains-api-model-0.c
+- testsuites/validation/tr-chains-api-model-1.c
+- testsuites/validation/tr-chains-api-model-10.c
+- testsuites/validation/tr-chains-api-model-11.c
+- testsuites/validation/tr-chains-api-model-12.c
+- testsuites/validation/tr-chains-api-model-13.c
+- testsuites/validation/tr-chains-api-model-14.c
+- testsuites/validation/tr-chains-api-model-15.c
+- testsuites/validation/tr-chains-api-model-16.c
+- testsuites/validation/tr-chains-api-model-17.c
+- testsuites/validation/tr-chains-api-model-18.c
+- testsuites/validation/tr-chains-api-model-19.c
+- testsuites/validation/tr-chains-api-model-2.c
+- testsuites/validation/tr-chains-api-model-20.c
+- testsuites/validation/tr-chains-api-model-3.c
+- testsuites/validation/tr-chains-api-model-4.c
+- testsuites/validation/tr-chains-api-model-5.c
+- testsuites/validation/tr-chains-api-model-6.c
+- testsuites/validation/tr-chains-api-model-7.c
+- testsuites/validation/tr-chains-api-model-8.c
+- testsuites/validation/tr-chains-api-model-9.c
+- testsuites/validation/tr-chains-api-model.c
+- testsuites/validation/tr-event-mgr-model-0.c
+- testsuites/validation/tr-event-mgr-model-1.c
+- testsuites/validation/tr-event-mgr-model-2.c
+- testsuites/validation/tr-event-mgr-model-3.c
+- testsuites/validation/tr-event-mgr-model-4.c
+- testsuites/validation/tr-event-mgr-model-5.c
+- testsuites/validation/tr-event-mgr-model-6.c
+- testsuites/validation/tr-event-mgr-model-7.c
+- testsuites/validation/tr-event-mgr-model-8.c
+- testsuites/validation/tr-event-mgr-model.c
+- testsuites/validation/ts-model-0.c
+stlib: []
+target: testsuites/validation/ts-model-0.exe
+type: build
+use-after:
+- validation
+use-before: []
diff --git a/testsuites/validation/tc-event-mgr-model.c b/testsuites/validation/tc-event-mgr-model.c
new file mode 100644
index 0000000000..3c16b36052
--- /dev/null
+++ b/testsuites/validation/tc-event-mgr-model.c
@@ -0,0 +1,358 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsEventValSendReceive
+ * @ingroup RTEMSTestCaseRtemsEventValSystemSendReceive
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Do not manually edit this file. It is part of the RTEMS quality process
+ * and was automatically generated.
+ *
+ * If you find something that needs to be fixed or worded better please
+ * post a report to an RTEMS mailing list or raise a bug report:
+ *
+ * https://docs.rtems.org/branches/master/user/support/bugs.html
+ *
+ * For information on updating and regenerating please refer to:
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/rtems/eventimpl.h>
+#include <rtems/rtems/tasksdata.h>
+#include <rtems/score/statesimpl.h>
+#include <rtems/score/threadimpl.h>
+
+#include "tr-event-mgr-model.h"
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestCaseRtemsEventValSendReceive \
+ * spec:/rtems/event/val/send-receive
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidation0
+ *
+ * @brief Tests the rtems_event_send and rtems_event_receive directives.
+ *
+ * This test case performs the following actions:
+ *
+ * - Run the event send and receive tests for the application event set defined
+ * by /rtems/event/req/send-receive.
+ *
+ * @{
+ */
+
+static rtems_status_code EventSend(
+ rtems_id id,
+ rtems_event_set event_in
+)
+{
+ return rtems_event_send( id, event_in );
+}
+
+static rtems_status_code EventReceive(
+ rtems_id event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+)
+{
+ return rtems_event_receive( event_in, option_set, ticks, event_out );
+}
+
+static rtems_event_set GetPendingEvents( Thread_Control *thread )
+{
+ RTEMS_API_Control *api;
+
+ api = thread->API_Extensions[ THREAD_API_RTEMS ];
+ return api->Event.pending_events;
+}
+
+/**
+ * @fn void T_case_body_RtemsEventValSendReceive( void )
+ */
+T_TEST_CASE( RtemsModelEventsMgr0 )
+{
+ RtemsModelEventsMgr_Run0(
+ EventSend,
+ EventReceive,
+ GetPendingEvents,
+ THREAD_WAIT_CLASS_EVENT,
+ STATES_WAITING_FOR_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelEventsMgr1 )
+{
+ RtemsModelEventsMgr_Run1(
+ EventSend,
+ EventReceive,
+ GetPendingEvents,
+ THREAD_WAIT_CLASS_EVENT,
+ STATES_WAITING_FOR_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelEventsMgr2 )
+{
+ RtemsModelEventsMgr_Run2(
+ EventSend,
+ EventReceive,
+ GetPendingEvents,
+ THREAD_WAIT_CLASS_EVENT,
+ STATES_WAITING_FOR_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelEventsMgr3 )
+{
+ RtemsModelEventsMgr_Run3(
+ EventSend,
+ EventReceive,
+ GetPendingEvents,
+ THREAD_WAIT_CLASS_EVENT,
+ STATES_WAITING_FOR_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelEventsMgr4 )
+{
+ RtemsModelEventsMgr_Run4(
+ EventSend,
+ EventReceive,
+ GetPendingEvents,
+ THREAD_WAIT_CLASS_EVENT,
+ STATES_WAITING_FOR_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelEventsMgr5 )
+{
+ RtemsModelEventsMgr_Run5(
+ EventSend,
+ EventReceive,
+ GetPendingEvents,
+ THREAD_WAIT_CLASS_EVENT,
+ STATES_WAITING_FOR_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelEventsMgr6 )
+{
+ RtemsModelEventsMgr_Run6(
+ EventSend,
+ EventReceive,
+ GetPendingEvents,
+ THREAD_WAIT_CLASS_EVENT,
+ STATES_WAITING_FOR_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelEventsMgr7 )
+{
+ RtemsModelEventsMgr_Run7(
+ EventSend,
+ EventReceive,
+ GetPendingEvents,
+ THREAD_WAIT_CLASS_EVENT,
+ STATES_WAITING_FOR_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelEventsMgr8 )
+{
+ RtemsModelEventsMgr_Run8(
+ EventSend,
+ EventReceive,
+ GetPendingEvents,
+ THREAD_WAIT_CLASS_EVENT,
+ STATES_WAITING_FOR_EVENT
+ );
+}
+
+/** @} */
+
+/**
+ * @defgroup RTEMSTestCaseRtemsEventValSystemSendReceive \
+ * spec:/rtems/event/val/system-send-receive
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesValidation0
+ *
+ * @brief Tests the rtems_event_system_send and rtems_event_system_receive
+ * directives.
+ *
+ * This test case performs the following actions:
+ *
+ * - Run the event send and receive tests for the system event set defined by
+ * /rtems/event/req/send-receive.
+ *
+ * @{
+ */
+
+static rtems_status_code EventSystemSend(
+ rtems_id id,
+ rtems_event_set event_in
+)
+{
+ return rtems_event_system_send( id, event_in );
+}
+
+static rtems_status_code EventSystemReceive(
+ rtems_id event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+)
+{
+ return rtems_event_system_receive(
+ event_in,
+ option_set,
+ ticks,
+ event_out
+ );
+}
+
+static rtems_event_set GetPendingSystemEvents( Thread_Control *thread )
+{
+ RTEMS_API_Control *api;
+
+ api = thread->API_Extensions[ THREAD_API_RTEMS ];
+ return api->System_event.pending_events;
+}
+
+/**
+ * @fn void T_case_body_RtemsEventValSystemSendReceive( void )
+ */
+T_TEST_CASE( RtemsModelSystemEventsMgr0 )
+{
+ RtemsModelEventsMgr_Run0(
+ EventSystemSend,
+ EventSystemReceive,
+ GetPendingSystemEvents,
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelSystemEventsMgr1 )
+{
+ RtemsModelEventsMgr_Run1(
+ EventSystemSend,
+ EventSystemReceive,
+ GetPendingSystemEvents,
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelSystemEventsMgr2 )
+{
+ RtemsModelEventsMgr_Run2(
+ EventSystemSend,
+ EventSystemReceive,
+ GetPendingSystemEvents,
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelSystemEventsMgr3 )
+{
+ RtemsModelEventsMgr_Run3(
+ EventSystemSend,
+ EventSystemReceive,
+ GetPendingSystemEvents,
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelSystemEventsMgr4 )
+{
+ RtemsModelEventsMgr_Run4(
+ EventSystemSend,
+ EventSystemReceive,
+ GetPendingSystemEvents,
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelSystemEventsMgr5 )
+{
+ RtemsModelEventsMgr_Run5(
+ EventSystemSend,
+ EventSystemReceive,
+ GetPendingSystemEvents,
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelSystemEventsMgr6 )
+{
+ RtemsModelEventsMgr_Run6(
+ EventSystemSend,
+ EventSystemReceive,
+ GetPendingSystemEvents,
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelSystemEventsMgr7 )
+{
+ RtemsModelEventsMgr_Run7(
+ EventSystemSend,
+ EventSystemReceive,
+ GetPendingSystemEvents,
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT
+ );
+}
+
+T_TEST_CASE( RtemsModelSystemEventsMgr8 )
+{
+ RtemsModelEventsMgr_Run8(
+ EventSystemSend,
+ EventSystemReceive,
+ GetPendingSystemEvents,
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT
+ );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-chains-api-model-0.c b/testsuites/validation/tr-chains-api-model-0.c
new file mode 100644
index 0000000000..4b91a04637
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-0.c
@@ -0,0 +1,165 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run0(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI0 )
+{
+ RtemsModelChainsAPI_Run0( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-1.c b/testsuites/validation/tr-chains-api-model-1.c
new file mode 100644
index 0000000000..b3cf2945bd
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-1.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run1(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI1 )
+{
+ RtemsModelChainsAPI_Run1( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-10.c b/testsuites/validation/tr-chains-api-model-10.c
new file mode 100644
index 0000000000..06743dabfe
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-10.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run10(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI10 )
+{
+ RtemsModelChainsAPI_Run10( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-11.c b/testsuites/validation/tr-chains-api-model-11.c
new file mode 100644
index 0000000000..37d28daafa
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-11.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run11(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI11 )
+{
+ RtemsModelChainsAPI_Run11( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-12.c b/testsuites/validation/tr-chains-api-model-12.c
new file mode 100644
index 0000000000..d859955235
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-12.c
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run12(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI12 )
+{
+ RtemsModelChainsAPI_Run12( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-13.c b/testsuites/validation/tr-chains-api-model-13.c
new file mode 100644
index 0000000000..325baac2cd
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-13.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run13(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI13 )
+{
+ RtemsModelChainsAPI_Run13( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-14.c b/testsuites/validation/tr-chains-api-model-14.c
new file mode 100644
index 0000000000..51d20620a1
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-14.c
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run14(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI14 )
+{
+ RtemsModelChainsAPI_Run14( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-15.c b/testsuites/validation/tr-chains-api-model-15.c
new file mode 100644
index 0000000000..1ca6cd80d7
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-15.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run15(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI15 )
+{
+ RtemsModelChainsAPI_Run15( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-16.c b/testsuites/validation/tr-chains-api-model-16.c
new file mode 100644
index 0000000000..a6158a884e
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-16.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run16(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI16 )
+{
+ RtemsModelChainsAPI_Run16( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-17.c b/testsuites/validation/tr-chains-api-model-17.c
new file mode 100644
index 0000000000..bed84d8051
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-17.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run17(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI17 )
+{
+ RtemsModelChainsAPI_Run17( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-18.c b/testsuites/validation/tr-chains-api-model-18.c
new file mode 100644
index 0000000000..1d9c6cf0b4
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-18.c
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run18(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI18 )
+{
+ RtemsModelChainsAPI_Run18( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-19.c b/testsuites/validation/tr-chains-api-model-19.c
new file mode 100644
index 0000000000..1e260041f1
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-19.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run19(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI19 )
+{
+ RtemsModelChainsAPI_Run19( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-2.c b/testsuites/validation/tr-chains-api-model-2.c
new file mode 100644
index 0000000000..ce2eec0edd
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-2.c
@@ -0,0 +1,165 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run2(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI2 )
+{
+ RtemsModelChainsAPI_Run2( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-20.c b/testsuites/validation/tr-chains-api-model-20.c
new file mode 100644
index 0000000000..8c290026d6
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-20.c
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run20(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI20 )
+{
+ RtemsModelChainsAPI_Run20( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-3.c b/testsuites/validation/tr-chains-api-model-3.c
new file mode 100644
index 0000000000..ed87860371
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-3.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run3(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI3 )
+{
+ RtemsModelChainsAPI_Run3( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-4.c b/testsuites/validation/tr-chains-api-model-4.c
new file mode 100644
index 0000000000..4a01ecf53c
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-4.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run4(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI4 )
+{
+ RtemsModelChainsAPI_Run4( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-5.c b/testsuites/validation/tr-chains-api-model-5.c
new file mode 100644
index 0000000000..b54a84a9ef
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-5.c
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run5(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI5 )
+{
+ RtemsModelChainsAPI_Run5( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-6.c b/testsuites/validation/tr-chains-api-model-6.c
new file mode 100644
index 0000000000..94a7a0f632
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-6.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run6(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI6 )
+{
+ RtemsModelChainsAPI_Run6( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-7.c b/testsuites/validation/tr-chains-api-model-7.c
new file mode 100644
index 0000000000..dcae640049
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-7.c
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run7(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI7 )
+{
+ RtemsModelChainsAPI_Run7( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-8.c b/testsuites/validation/tr-chains-api-model-8.c
new file mode 100644
index 0000000000..eab1761120
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-8.c
@@ -0,0 +1,167 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run8(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI8 )
+{
+ RtemsModelChainsAPI_Run8( );
+}
diff --git a/testsuites/validation/tr-chains-api-model-9.c b/testsuites/validation/tr-chains-api-model-9.c
new file mode 100644
index 0000000000..918b8fc1dd
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model-9.c
@@ -0,0 +1,165 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Chain_AutoGen
+// @@@ 0 DEF MAX_SIZE 8
+#define MAX_SIZE 8
+// @@@ 0 DCLARRAY Node memory MAX_SIZE
+static item memory[MAX_SIZE];
+// @@@ 0 DECL unsigned nptr NULL
+static item * nptr = NULL;
+// @@@ 0 DECL Control chain
+static rtems_chain_control chain;
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ const char rtems_test_name[] = "Model_Chain_API";
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ rtems_chain_initialize_empty( &chain );
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 0");
+ T_eq_ptr( nptr, NULL );
+ T_log(T_NORMAL,"@@@ 0 CALL append 22 3");
+ memory[3].val = 22;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 22");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 22 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 3");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[3] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 3");
+ T_eq_ptr( nptr, &memory[3] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 22");
+ T_eq_int( nptr->val, 22 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 21 6");
+ memory[6].val = 21;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 21");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 21 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 6");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[6] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 6");
+ T_eq_ptr( nptr, &memory[6] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 21");
+ T_eq_int( nptr->val, 21 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+ T_log(T_NORMAL,"@@@ 0 CALL append 23 4");
+ memory[4].val = 23;
+ rtems_chain_append_unprotected( &chain, (rtems_chain_node*)&memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 SCALAR _ 23");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 23 0" );
+
+ T_log(T_NORMAL,"@@@ 0 CALL getNonNull 4");
+ nptr = get_item( &chain );
+ T_eq_ptr( nptr, &memory[4] );
+
+ T_log(T_NORMAL,"@@@ 0 SEQ chain");
+ T_log(T_NORMAL,"@@@ 0 END chain");
+ show_chain( &chain, ctx->buffer );
+ T_eq_str( ctx->buffer, " 0" );
+
+ T_log(T_NORMAL,"@@@ 0 PTR nptr 4");
+ T_eq_ptr( nptr, &memory[4] );
+ T_log(T_NORMAL,"@@@ 0 STRUCT nptr");
+ T_log(T_NORMAL,"@@@ 0 SCALAR itm 23");
+ T_eq_int( nptr->val, 23 );
+ T_log(T_NORMAL,"@@@ 0 END nptr");
+}
+
+// ===============================================
+
+
+/* post-amble empty for now */
+void RtemsModelChainsAPI_Run9(
+)
+{
+ Context ctx;
+
+ memset( &ctx, 0, sizeof( ctx ) );
+
+ T_set_verbosity( T_NORMAL );
+
+ TestSegment0( &ctx );
+}
+
+T_TEST_CASE( RtemsModelChainAPI9 )
+{
+ RtemsModelChainsAPI_Run9( );
+}
diff --git a/testsuites/validation/tr-chains-api-model.c b/testsuites/validation/tr-chains-api-model.c
new file mode 100644
index 0000000000..c804ca0714
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model.c
@@ -0,0 +1,68 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+#include <rtems.h>
+#include <rtems/test.h>
+#include <rtems/chain.h>
+#include "tr-chains-api-model.h"
+
+item* get_item( rtems_chain_control* control )
+{
+ return (item*) rtems_chain_get_unprotected( control );
+}
+
+void show_chain( rtems_chain_control *control, char *str )
+{
+ item *itm;
+ rtems_chain_node *nod;
+ int cp, len;
+ char *s;
+
+ nod = (rtems_chain_node *)&control->Head;
+ itm = (item *)nod->next;
+ // itm is not NULL
+ s = str;
+ len = BUFSIZE;
+ while ( (item*)((rtems_chain_node*)itm)->next ) { // NULL when at control
+ cp = T_snprintf( s, len, " %d",itm->val );
+ s += cp;
+ len -= cp;
+ itm = (item*)((rtems_chain_node*)itm)->next;
+ }
+ cp = T_snprintf( s, len, " 0" );
+ s += cp;
+ len -= cp;
+}
diff --git a/testsuites/validation/tr-chains-api-model.h b/testsuites/validation/tr-chains-api-model.h
new file mode 100644
index 0000000000..bcf81e8963
--- /dev/null
+++ b/testsuites/validation/tr-chains-api-model.h
@@ -0,0 +1,55 @@
+/******************************************************************************
+ * FV2-201
+ *
+ * Copyright (C) 2019-2021 Trinity College Dublin (www.tcd.ie)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ******************************************************************************/
+
+
+typedef struct item
+{
+ rtems_chain_node node;
+ int val;
+} item;
+
+item* get_item( rtems_chain_control* control);
+
+void show_chain(rtems_chain_control *control, char *str);
+
+#define BUFSIZE 80
+
+typedef struct {
+ int stuff;
+ char buffer[BUFSIZE];
+} RtemsModelChainsAPI_Context;
+
+typedef RtemsModelChainsAPI_Context Context;
diff --git a/testsuites/validation/tr-event-mgr-model-0.c b/testsuites/validation/tr-event-mgr-model-0.c
new file mode 100644
index 0000000000..b93e83622d
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model-0.c
@@ -0,0 +1,344 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+
+#include "tr-event-mgr-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Event_Manager_TestGen
+// @@@ 0 DEF NO_OF_EVENTS 4
+#define NO_OF_EVENTS 4
+// @@@ 0 DEF EVTS_NONE 0
+#define EVTS_NONE 0
+// @@@ 0 DEF EVTS_PENDING 0
+#define EVTS_PENDING 0
+// @@@ 0 DEF EVT_0 1
+#define EVT_0 1
+// @@@ 0 DEF EVT_1 2
+#define EVT_1 2
+// @@@ 0 DEF EVT_2 4
+#define EVT_2 4
+// @@@ 0 DEF EVT_3 8
+#define EVT_3 8
+// @@@ 0 DEF NO_TIMEOUT 0
+#define NO_TIMEOUT 0
+// @@@ 0 DEF TASK_MAX 3
+#define TASK_MAX 3
+// @@@ 0 DEF BAD_ID 3
+#define BAD_ID 3
+// @@@ 0 DEF SEMA_MAX 2
+#define SEMA_MAX 2
+// @@@ 0 DEF RC_OK RTEMS_SUCCESSFUL
+#define RC_OK RTEMS_SUCCESSFUL
+// @@@ 0 DEF RC_InvId RTEMS_INVALID_ID
+#define RC_InvId RTEMS_INVALID_ID
+// @@@ 0 DEF RC_InvAddr RTEMS_INVALID_ADDRESS
+#define RC_InvAddr RTEMS_INVALID_ADDRESS
+// @@@ 0 DEF RC_Unsat RTEMS_UNSATISFIED
+#define RC_Unsat RTEMS_UNSATISFIED
+// @@@ 0 DEF RC_Timeout RTEMS_TIMEOUT
+#define RC_Timeout RTEMS_TIMEOUT
+// @@@ 0 DECL byte sendrc 0
+static rtems_status_code sendrc = 0;
+// @@@ 0 DECL byte recrc 0
+static rtems_status_code recrc = 0;
+// @@@ 0 DCLARRAY EvtSet pending TASK_MAX
+static rtems_event_set pending[TASK_MAX];
+// @@@ 0 DCLARRAY byte recout TASK_MAX
+static rtems_event_set recout[TASK_MAX];
+// @@@ 0 DCLARRAY Semaphore semaphore SEMA_MAX
+static rtems_id semaphore[SEMA_MAX];
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ /* Test Name is defined in the Test Case code (tc-model-events-mgr.c) */
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ initialise_pending( pending, TASK_MAX );
+ initialise_semaphore( ctx, semaphore );
+
+}
+
+// ===== TEST CODE SEGMENT 3 =====
+
+static void TestSegment3( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 3 TASK Worker");
+ checkTaskIs( ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 CALL EqualPriority");
+ SetSelfPriority( PRIO_NORMAL );
+ rtems_task_priority prio;
+ rtems_status_code sc;
+ sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_NORMAL );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 CALL StartLog");
+ T_thread_switch_log *log;
+ log = T_thread_switch_record_4( &ctx->thread_switch_log );
+
+ T_log(T_NORMAL,"@@@ 3 CALL event_send 1 3 10 sendrc");
+ T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 3), 10 );
+ sendrc = ( *ctx->send )( mapid( ctx, 3 ), 10 );
+ T_log( T_NORMAL, "Returned 0x%x from Send", sendrc );
+
+ T_log(T_NORMAL,"@@@ 3 CALL CheckNoPreemption");
+ log = &ctx->thread_switch_log;
+ T_le_sz( log->header.recorded, 1 );
+ for ( size_t i = 0; i < log->header.recorded; ++i ) {
+ T_ne_u32( log->events[ i ].executing, ctx->worker_id );
+ T_eq_u32( log->events[ i ].heir, ctx->runner_id );
+ }
+
+ T_log(T_NORMAL,"@@@ 3 SCALAR sendrc 4");
+ T_rsc( sendrc, 4 );
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Zombie");
+ /* Code to check that Task 1 has terminated */
+}
+
+// ===== TEST CODE SEGMENT 4 =====
+
+static void TestSegment4( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 4 TASK Runner");
+ checkTaskIs( ctx->runner_id );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 WAIT 1");
+ Wait( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Zombie");
+ /* Code to check that Task 2 has terminated */
+}
+
+// ===============================================
+
+
+
+static void Runner( RtemsModelEventsMgr_Context *ctx )
+{
+ T_log( T_NORMAL, "Runner running" );
+ TestSegment4( ctx );
+ T_log( T_NORMAL, "Runner finished" );
+}
+
+static void Worker0( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_event_set events;
+
+ ctx = (Context *) arg;
+
+ T_log( T_NORMAL, "Worker Running" );
+ TestSegment3( ctx );
+ T_log( T_NORMAL, "Worker finished" );
+
+ // (void) rtems_task_suspend( RTEMS_SELF );
+ // Ensure we hold no semaphores
+ Wakeup( ctx->worker_wakeup );
+ Wakeup( ctx->runner_wakeup );
+ // Wait for events so we don't terminate
+ rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_DEFAULT_OPTIONS, 0, &events );
+
+}
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage0[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ WORKER_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config WorkerConfig0 = {
+ .name = rtems_build_name( 'W', 'O', 'R', 'K' ),
+ .initial_priority = PRIO_LOW,
+ .storage_area = WorkerStorage0,
+ .storage_size = sizeof( WorkerStorage0 ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = WORKER_ATTRIBUTES
+};
+
+
+static void RtemsModelEventsMgr_Setup0(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Setup" );
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_thread = _Thread_Get_executing();
+ ctx->runner_id = ctx->runner_thread->Object.id;
+
+ T_log( T_NORMAL, "Creating Worker Wakeup Semaphore" );
+ ctx->worker_wakeup = CreateWakeupSema();
+ T_log( T_NORMAL, "Creating Runner Wakeup Semaphore" );
+ ctx->runner_wakeup = CreateWakeupSema();
+
+ sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_sched );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident_by_processor( 1, &ctx->other_sched );
+ T_rsc_success( sc );
+ T_ne_u32( ctx->runner_sched, ctx->other_sched );
+ #endif
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_HIGH );
+
+ sc = rtems_task_construct( &WorkerConfig0, &ctx->worker_id );
+ T_log( T_NORMAL, "Construct Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+
+ T_log( T_NORMAL, "Starting Worker..." );
+ sc = rtems_task_start( ctx->worker_id, Worker0, (rtems_task_argument) ctx );
+ T_log( T_NORMAL, "Started Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+}
+
+
+static void RtemsModelEventsMgr_Setup_Wrap0( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Setup0( ctx );
+}
+
+
+static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance0;
+
+static T_fixture RtemsModelEventsMgr_Fixture0 = {
+ .setup = RtemsModelEventsMgr_Setup_Wrap0,
+ .stop = NULL,
+ .teardown = RtemsModelEventsMgr_Teardown_Wrap,
+ .scope = RtemsModelEventsMgr_Scope,
+ .initial_context = &RtemsModelEventsMgr_Instance0
+};
+
+static T_fixture_node RtemsModelEventsMgr_Node0;
+
+void RtemsModelEventsMgr_Run0(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+)
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ T_set_verbosity( T_NORMAL );
+
+ T_log( T_NORMAL, "Runner Invoked" );
+ T_log( T_NORMAL, "Runner Wait Class: %d", wait_class );
+ T_log( T_NORMAL, "Runner WaitForEvent: %d", waiting_for_event );
+
+ T_log( T_NORMAL, "Pushing Test Fixture..." );
+
+
+ ctx = T_push_fixture(
+ &RtemsModelEventsMgr_Node0,
+ &RtemsModelEventsMgr_Fixture0
+ );
+ // This runs RtemsModelEventsMgr_Fixture
+
+ T_log( T_NORMAL, "Test Fixture Pushed" );
+
+
+ ctx->send = send;
+ ctx->receive = receive;
+ ctx->get_pending_events = get_pending_events;
+ ctx->wait_class = wait_class;
+ ctx->waiting_for_event = waiting_for_event;
+
+ ctx->this_test_number = 0;
+
+ // RtemsModelEventsMgr_Prepare( ctx );
+ ctx->events_to_send = 0;
+ ctx->send_status = RTEMS_INCORRECT_STATE;
+ ctx->received_events = 0xffffffff;
+ ctx->receive_option_set = 0;
+ ctx->receive_timeout = RTEMS_NO_TIMEOUT;
+ ctx->unsatisfied_pending = 0xffffffff;
+ memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) );
+ T_eq_u32( GetPending( ctx ), 0 );
+ _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_STATE_READY );
+
+ TestSegment0( ctx );
+
+ Runner( ctx );
+
+ RtemsModelEventsMgr_Cleanup( ctx );
+
+ T_log( T_NORMAL, "Run Pop Fixture" );
+ ShowWorkerSemaId( ctx );
+ T_pop_fixture();
+ ShowWorkerSemaId( ctx );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-event-mgr-model-1.c b/testsuites/validation/tr-event-mgr-model-1.c
new file mode 100644
index 0000000000..60a09ad50f
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model-1.c
@@ -0,0 +1,342 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+
+#include "tr-event-mgr-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Event_Manager_TestGen
+// @@@ 0 DEF NO_OF_EVENTS 4
+#define NO_OF_EVENTS 4
+// @@@ 0 DEF EVTS_NONE 0
+#define EVTS_NONE 0
+// @@@ 0 DEF EVTS_PENDING 0
+#define EVTS_PENDING 0
+// @@@ 0 DEF EVT_0 1
+#define EVT_0 1
+// @@@ 0 DEF EVT_1 2
+#define EVT_1 2
+// @@@ 0 DEF EVT_2 4
+#define EVT_2 4
+// @@@ 0 DEF EVT_3 8
+#define EVT_3 8
+// @@@ 0 DEF NO_TIMEOUT 0
+#define NO_TIMEOUT 0
+// @@@ 0 DEF TASK_MAX 3
+#define TASK_MAX 3
+// @@@ 0 DEF BAD_ID 3
+#define BAD_ID 3
+// @@@ 0 DEF SEMA_MAX 2
+#define SEMA_MAX 2
+// @@@ 0 DEF RC_OK RTEMS_SUCCESSFUL
+#define RC_OK RTEMS_SUCCESSFUL
+// @@@ 0 DEF RC_InvId RTEMS_INVALID_ID
+#define RC_InvId RTEMS_INVALID_ID
+// @@@ 0 DEF RC_InvAddr RTEMS_INVALID_ADDRESS
+#define RC_InvAddr RTEMS_INVALID_ADDRESS
+// @@@ 0 DEF RC_Unsat RTEMS_UNSATISFIED
+#define RC_Unsat RTEMS_UNSATISFIED
+// @@@ 0 DEF RC_Timeout RTEMS_TIMEOUT
+#define RC_Timeout RTEMS_TIMEOUT
+// @@@ 0 DECL byte sendrc 0
+static rtems_status_code sendrc = 0;
+// @@@ 0 DECL byte recrc 0
+static rtems_status_code recrc = 0;
+// @@@ 0 DCLARRAY EvtSet pending TASK_MAX
+static rtems_event_set pending[TASK_MAX];
+// @@@ 0 DCLARRAY byte recout TASK_MAX
+static rtems_event_set recout[TASK_MAX];
+// @@@ 0 DCLARRAY Semaphore semaphore SEMA_MAX
+static rtems_id semaphore[SEMA_MAX];
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ /* Test Name is defined in the Test Case code (tc-model-events-mgr.c) */
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ initialise_pending( pending, TASK_MAX );
+ initialise_semaphore( ctx, semaphore );
+
+}
+
+// ===== TEST CODE SEGMENT 3 =====
+
+static void TestSegment3( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 3 TASK Worker");
+ checkTaskIs( ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 CALL EqualPriority");
+ SetSelfPriority( PRIO_NORMAL );
+ rtems_task_priority prio;
+ rtems_status_code sc;
+ sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_NORMAL );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Zombie");
+ /* Code to check that Task 1 has terminated */
+}
+
+// ===== TEST CODE SEGMENT 4 =====
+
+static void TestSegment4( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 4 TASK Runner");
+ checkTaskIs( ctx->runner_id );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 WAIT 1");
+ Wait( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 CALL event_receive 10 0 1 0 2 recrc");
+ T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 10, mergeopts( 0, 1 ) ,0 , 2 ? &recout[2] : NULL );
+ recrc = ( *ctx->receive )( 10, mergeopts( 0, 1 ), 0, 2 ? &recout[2] : NULL );
+ T_log( T_NORMAL, "Returned 0x%x from Receive", recrc );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR recrc 13");
+ T_rsc( recrc, 13 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR recout 2 0");
+ T_eq_int( recout[2], 0 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Zombie");
+ /* Code to check that Task 2 has terminated */
+}
+
+// ===============================================
+
+
+
+static void Runner( RtemsModelEventsMgr_Context *ctx )
+{
+ T_log( T_NORMAL, "Runner running" );
+ TestSegment4( ctx );
+ T_log( T_NORMAL, "Runner finished" );
+}
+
+static void Worker1( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_event_set events;
+
+ ctx = (Context *) arg;
+
+ T_log( T_NORMAL, "Worker Running" );
+ TestSegment3( ctx );
+ T_log( T_NORMAL, "Worker finished" );
+
+ // (void) rtems_task_suspend( RTEMS_SELF );
+ // Ensure we hold no semaphores
+ Wakeup( ctx->worker_wakeup );
+ Wakeup( ctx->runner_wakeup );
+ // Wait for events so we don't terminate
+ rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_DEFAULT_OPTIONS, 0, &events );
+
+}
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage1[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ WORKER_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config WorkerConfig1 = {
+ .name = rtems_build_name( 'W', 'O', 'R', 'K' ),
+ .initial_priority = PRIO_LOW,
+ .storage_area = WorkerStorage1,
+ .storage_size = sizeof( WorkerStorage1 ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = WORKER_ATTRIBUTES
+};
+
+
+static void RtemsModelEventsMgr_Setup1(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Setup" );
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_thread = _Thread_Get_executing();
+ ctx->runner_id = ctx->runner_thread->Object.id;
+
+ T_log( T_NORMAL, "Creating Worker Wakeup Semaphore" );
+ ctx->worker_wakeup = CreateWakeupSema();
+ T_log( T_NORMAL, "Creating Runner Wakeup Semaphore" );
+ ctx->runner_wakeup = CreateWakeupSema();
+
+ sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_sched );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident_by_processor( 1, &ctx->other_sched );
+ T_rsc_success( sc );
+ T_ne_u32( ctx->runner_sched, ctx->other_sched );
+ #endif
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_HIGH );
+
+ sc = rtems_task_construct( &WorkerConfig1, &ctx->worker_id );
+ T_log( T_NORMAL, "Construct Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+
+ T_log( T_NORMAL, "Starting Worker..." );
+ sc = rtems_task_start( ctx->worker_id, Worker1, (rtems_task_argument) ctx );
+ T_log( T_NORMAL, "Started Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+}
+
+
+static void RtemsModelEventsMgr_Setup_Wrap1( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Setup1( ctx );
+}
+
+
+static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance1;
+
+static T_fixture RtemsModelEventsMgr_Fixture1 = {
+ .setup = RtemsModelEventsMgr_Setup_Wrap1,
+ .stop = NULL,
+ .teardown = RtemsModelEventsMgr_Teardown_Wrap,
+ .scope = RtemsModelEventsMgr_Scope,
+ .initial_context = &RtemsModelEventsMgr_Instance1
+};
+
+static T_fixture_node RtemsModelEventsMgr_Node1;
+
+void RtemsModelEventsMgr_Run1(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+)
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ T_set_verbosity( T_NORMAL );
+
+ T_log( T_NORMAL, "Runner Invoked" );
+ T_log( T_NORMAL, "Runner Wait Class: %d", wait_class );
+ T_log( T_NORMAL, "Runner WaitForEvent: %d", waiting_for_event );
+
+ T_log( T_NORMAL, "Pushing Test Fixture..." );
+
+
+ ctx = T_push_fixture(
+ &RtemsModelEventsMgr_Node1,
+ &RtemsModelEventsMgr_Fixture1
+ );
+ // This runs RtemsModelEventsMgr_Fixture
+
+ T_log( T_NORMAL, "Test Fixture Pushed" );
+
+
+ ctx->send = send;
+ ctx->receive = receive;
+ ctx->get_pending_events = get_pending_events;
+ ctx->wait_class = wait_class;
+ ctx->waiting_for_event = waiting_for_event;
+
+ ctx->this_test_number = 1;
+
+ // RtemsModelEventsMgr_Prepare( ctx );
+ ctx->events_to_send = 0;
+ ctx->send_status = RTEMS_INCORRECT_STATE;
+ ctx->received_events = 0xffffffff;
+ ctx->receive_option_set = 0;
+ ctx->receive_timeout = RTEMS_NO_TIMEOUT;
+ ctx->unsatisfied_pending = 0xffffffff;
+ memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) );
+ T_eq_u32( GetPending( ctx ), 0 );
+ _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_STATE_READY );
+
+ TestSegment0( ctx );
+
+ Runner( ctx );
+
+ RtemsModelEventsMgr_Cleanup( ctx );
+
+ T_log( T_NORMAL, "Run Pop Fixture" );
+ ShowWorkerSemaId( ctx );
+ T_pop_fixture();
+ ShowWorkerSemaId( ctx );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-event-mgr-model-2.c b/testsuites/validation/tr-event-mgr-model-2.c
new file mode 100644
index 0000000000..1c0bd40325
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model-2.c
@@ -0,0 +1,355 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+
+#include "tr-event-mgr-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Event_Manager_TestGen
+// @@@ 0 DEF NO_OF_EVENTS 4
+#define NO_OF_EVENTS 4
+// @@@ 0 DEF EVTS_NONE 0
+#define EVTS_NONE 0
+// @@@ 0 DEF EVTS_PENDING 0
+#define EVTS_PENDING 0
+// @@@ 0 DEF EVT_0 1
+#define EVT_0 1
+// @@@ 0 DEF EVT_1 2
+#define EVT_1 2
+// @@@ 0 DEF EVT_2 4
+#define EVT_2 4
+// @@@ 0 DEF EVT_3 8
+#define EVT_3 8
+// @@@ 0 DEF NO_TIMEOUT 0
+#define NO_TIMEOUT 0
+// @@@ 0 DEF TASK_MAX 3
+#define TASK_MAX 3
+// @@@ 0 DEF BAD_ID 3
+#define BAD_ID 3
+// @@@ 0 DEF SEMA_MAX 2
+#define SEMA_MAX 2
+// @@@ 0 DEF RC_OK RTEMS_SUCCESSFUL
+#define RC_OK RTEMS_SUCCESSFUL
+// @@@ 0 DEF RC_InvId RTEMS_INVALID_ID
+#define RC_InvId RTEMS_INVALID_ID
+// @@@ 0 DEF RC_InvAddr RTEMS_INVALID_ADDRESS
+#define RC_InvAddr RTEMS_INVALID_ADDRESS
+// @@@ 0 DEF RC_Unsat RTEMS_UNSATISFIED
+#define RC_Unsat RTEMS_UNSATISFIED
+// @@@ 0 DEF RC_Timeout RTEMS_TIMEOUT
+#define RC_Timeout RTEMS_TIMEOUT
+// @@@ 0 DECL byte sendrc 0
+static rtems_status_code sendrc = 0;
+// @@@ 0 DECL byte recrc 0
+static rtems_status_code recrc = 0;
+// @@@ 0 DCLARRAY EvtSet pending TASK_MAX
+static rtems_event_set pending[TASK_MAX];
+// @@@ 0 DCLARRAY byte recout TASK_MAX
+static rtems_event_set recout[TASK_MAX];
+// @@@ 0 DCLARRAY Semaphore semaphore SEMA_MAX
+static rtems_id semaphore[SEMA_MAX];
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ /* Test Name is defined in the Test Case code (tc-model-events-mgr.c) */
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ initialise_pending( pending, TASK_MAX );
+ initialise_semaphore( ctx, semaphore );
+
+}
+
+// ===== TEST CODE SEGMENT 2 =====
+
+static void TestSegment2( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 2 STATE 2 Ready");
+ /* We (Task 2) must have been recently ready because we are running */
+
+}
+
+// ===== TEST CODE SEGMENT 3 =====
+
+static void TestSegment3( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 3 TASK Worker");
+ checkTaskIs( ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 CALL EqualPriority");
+ SetSelfPriority( PRIO_NORMAL );
+ rtems_task_priority prio;
+ rtems_status_code sc;
+ sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_NORMAL );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Zombie");
+ /* Code to check that Task 1 has terminated */
+}
+
+// ===== TEST CODE SEGMENT 4 =====
+
+static void TestSegment4( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 4 TASK Runner");
+ checkTaskIs( ctx->runner_id );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 WAIT 1");
+ Wait( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 CALL event_receive 10 1 1 4 2 recrc");
+ T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 10, mergeopts( 1, 1 ) ,4 , 2 ? &recout[2] : NULL );
+ recrc = ( *ctx->receive )( 10, mergeopts( 1, 1 ), 4, 2 ? &recout[2] : NULL );
+ T_log( T_NORMAL, "Returned 0x%x from Receive", recrc );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 TimeWait 4");
+ // DON'T KNOW HOW TO REFINE: 4 'STATE
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Ready");
+ /* We (Task 2) must have been recently ready because we are running */
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR recrc 6");
+ T_rsc( recrc, 6 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR recout 2 0");
+ T_eq_int( recout[2], 0 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Zombie");
+ /* Code to check that Task 2 has terminated */
+}
+
+// ===============================================
+
+
+
+static void Runner( RtemsModelEventsMgr_Context *ctx )
+{
+ T_log( T_NORMAL, "Runner running" );
+ TestSegment4( ctx );
+ T_log( T_NORMAL, "Runner finished" );
+}
+
+static void Worker2( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_event_set events;
+
+ ctx = (Context *) arg;
+
+ T_log( T_NORMAL, "Worker Running" );
+ TestSegment3( ctx );
+ T_log( T_NORMAL, "Worker finished" );
+
+ // (void) rtems_task_suspend( RTEMS_SELF );
+ // Ensure we hold no semaphores
+ Wakeup( ctx->worker_wakeup );
+ Wakeup( ctx->runner_wakeup );
+ // Wait for events so we don't terminate
+ rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_DEFAULT_OPTIONS, 0, &events );
+
+}
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage2[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ WORKER_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config WorkerConfig2 = {
+ .name = rtems_build_name( 'W', 'O', 'R', 'K' ),
+ .initial_priority = PRIO_LOW,
+ .storage_area = WorkerStorage2,
+ .storage_size = sizeof( WorkerStorage2 ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = WORKER_ATTRIBUTES
+};
+
+
+static void RtemsModelEventsMgr_Setup2(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Setup" );
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_thread = _Thread_Get_executing();
+ ctx->runner_id = ctx->runner_thread->Object.id;
+
+ T_log( T_NORMAL, "Creating Worker Wakeup Semaphore" );
+ ctx->worker_wakeup = CreateWakeupSema();
+ T_log( T_NORMAL, "Creating Runner Wakeup Semaphore" );
+ ctx->runner_wakeup = CreateWakeupSema();
+
+ sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_sched );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident_by_processor( 1, &ctx->other_sched );
+ T_rsc_success( sc );
+ T_ne_u32( ctx->runner_sched, ctx->other_sched );
+ #endif
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_HIGH );
+
+ sc = rtems_task_construct( &WorkerConfig2, &ctx->worker_id );
+ T_log( T_NORMAL, "Construct Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+
+ T_log( T_NORMAL, "Starting Worker..." );
+ sc = rtems_task_start( ctx->worker_id, Worker2, (rtems_task_argument) ctx );
+ T_log( T_NORMAL, "Started Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+}
+
+
+static void RtemsModelEventsMgr_Setup_Wrap2( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Setup2( ctx );
+}
+
+
+static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance2;
+
+static T_fixture RtemsModelEventsMgr_Fixture2 = {
+ .setup = RtemsModelEventsMgr_Setup_Wrap2,
+ .stop = NULL,
+ .teardown = RtemsModelEventsMgr_Teardown_Wrap,
+ .scope = RtemsModelEventsMgr_Scope,
+ .initial_context = &RtemsModelEventsMgr_Instance2
+};
+
+static T_fixture_node RtemsModelEventsMgr_Node2;
+
+void RtemsModelEventsMgr_Run2(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+)
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ T_set_verbosity( T_NORMAL );
+
+ T_log( T_NORMAL, "Runner Invoked" );
+ T_log( T_NORMAL, "Runner Wait Class: %d", wait_class );
+ T_log( T_NORMAL, "Runner WaitForEvent: %d", waiting_for_event );
+
+ T_log( T_NORMAL, "Pushing Test Fixture..." );
+
+
+ ctx = T_push_fixture(
+ &RtemsModelEventsMgr_Node2,
+ &RtemsModelEventsMgr_Fixture2
+ );
+ // This runs RtemsModelEventsMgr_Fixture
+
+ T_log( T_NORMAL, "Test Fixture Pushed" );
+
+
+ ctx->send = send;
+ ctx->receive = receive;
+ ctx->get_pending_events = get_pending_events;
+ ctx->wait_class = wait_class;
+ ctx->waiting_for_event = waiting_for_event;
+
+ ctx->this_test_number = 2;
+
+ // RtemsModelEventsMgr_Prepare( ctx );
+ ctx->events_to_send = 0;
+ ctx->send_status = RTEMS_INCORRECT_STATE;
+ ctx->received_events = 0xffffffff;
+ ctx->receive_option_set = 0;
+ ctx->receive_timeout = RTEMS_NO_TIMEOUT;
+ ctx->unsatisfied_pending = 0xffffffff;
+ memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) );
+ T_eq_u32( GetPending( ctx ), 0 );
+ _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_STATE_READY );
+
+ TestSegment0( ctx );
+
+ Runner( ctx );
+
+ RtemsModelEventsMgr_Cleanup( ctx );
+
+ T_log( T_NORMAL, "Run Pop Fixture" );
+ ShowWorkerSemaId( ctx );
+ T_pop_fixture();
+ ShowWorkerSemaId( ctx );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-event-mgr-model-3.c b/testsuites/validation/tr-event-mgr-model-3.c
new file mode 100644
index 0000000000..a22b5c665b
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model-3.c
@@ -0,0 +1,340 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+
+#include "tr-event-mgr-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Event_Manager_TestGen
+// @@@ 0 DEF NO_OF_EVENTS 4
+#define NO_OF_EVENTS 4
+// @@@ 0 DEF EVTS_NONE 0
+#define EVTS_NONE 0
+// @@@ 0 DEF EVTS_PENDING 0
+#define EVTS_PENDING 0
+// @@@ 0 DEF EVT_0 1
+#define EVT_0 1
+// @@@ 0 DEF EVT_1 2
+#define EVT_1 2
+// @@@ 0 DEF EVT_2 4
+#define EVT_2 4
+// @@@ 0 DEF EVT_3 8
+#define EVT_3 8
+// @@@ 0 DEF NO_TIMEOUT 0
+#define NO_TIMEOUT 0
+// @@@ 0 DEF TASK_MAX 3
+#define TASK_MAX 3
+// @@@ 0 DEF BAD_ID 3
+#define BAD_ID 3
+// @@@ 0 DEF SEMA_MAX 2
+#define SEMA_MAX 2
+// @@@ 0 DEF RC_OK RTEMS_SUCCESSFUL
+#define RC_OK RTEMS_SUCCESSFUL
+// @@@ 0 DEF RC_InvId RTEMS_INVALID_ID
+#define RC_InvId RTEMS_INVALID_ID
+// @@@ 0 DEF RC_InvAddr RTEMS_INVALID_ADDRESS
+#define RC_InvAddr RTEMS_INVALID_ADDRESS
+// @@@ 0 DEF RC_Unsat RTEMS_UNSATISFIED
+#define RC_Unsat RTEMS_UNSATISFIED
+// @@@ 0 DEF RC_Timeout RTEMS_TIMEOUT
+#define RC_Timeout RTEMS_TIMEOUT
+// @@@ 0 DECL byte sendrc 0
+static rtems_status_code sendrc = 0;
+// @@@ 0 DECL byte recrc 0
+static rtems_status_code recrc = 0;
+// @@@ 0 DCLARRAY EvtSet pending TASK_MAX
+static rtems_event_set pending[TASK_MAX];
+// @@@ 0 DCLARRAY byte recout TASK_MAX
+static rtems_event_set recout[TASK_MAX];
+// @@@ 0 DCLARRAY Semaphore semaphore SEMA_MAX
+static rtems_id semaphore[SEMA_MAX];
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ /* Test Name is defined in the Test Case code (tc-model-events-mgr.c) */
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ initialise_pending( pending, TASK_MAX );
+ initialise_semaphore( ctx, semaphore );
+
+}
+
+// ===== TEST CODE SEGMENT 3 =====
+
+static void TestSegment3( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 3 TASK Worker");
+ checkTaskIs( ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 CALL EqualPriority");
+ SetSelfPriority( PRIO_NORMAL );
+ rtems_task_priority prio;
+ rtems_status_code sc;
+ sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_NORMAL );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Zombie");
+ /* Code to check that Task 1 has terminated */
+}
+
+// ===== TEST CODE SEGMENT 4 =====
+
+static void TestSegment4( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 4 TASK Runner");
+ checkTaskIs( ctx->runner_id );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 WAIT 1");
+ Wait( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 CALL event_receive 10 1 1 0 0 recrc");
+ T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 10, mergeopts( 1, 1 ) ,0 , 0 ? &recout[0] : NULL );
+ recrc = ( *ctx->receive )( 10, mergeopts( 1, 1 ), 0, 0 ? &recout[0] : NULL );
+ T_log( T_NORMAL, "Returned 0x%x from Receive", recrc );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR recrc 9");
+ T_rsc( recrc, 9 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Zombie");
+ /* Code to check that Task 2 has terminated */
+}
+
+// ===============================================
+
+
+
+static void Runner( RtemsModelEventsMgr_Context *ctx )
+{
+ T_log( T_NORMAL, "Runner running" );
+ TestSegment4( ctx );
+ T_log( T_NORMAL, "Runner finished" );
+}
+
+static void Worker3( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_event_set events;
+
+ ctx = (Context *) arg;
+
+ T_log( T_NORMAL, "Worker Running" );
+ TestSegment3( ctx );
+ T_log( T_NORMAL, "Worker finished" );
+
+ // (void) rtems_task_suspend( RTEMS_SELF );
+ // Ensure we hold no semaphores
+ Wakeup( ctx->worker_wakeup );
+ Wakeup( ctx->runner_wakeup );
+ // Wait for events so we don't terminate
+ rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_DEFAULT_OPTIONS, 0, &events );
+
+}
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage3[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ WORKER_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config WorkerConfig3 = {
+ .name = rtems_build_name( 'W', 'O', 'R', 'K' ),
+ .initial_priority = PRIO_LOW,
+ .storage_area = WorkerStorage3,
+ .storage_size = sizeof( WorkerStorage3 ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = WORKER_ATTRIBUTES
+};
+
+
+static void RtemsModelEventsMgr_Setup3(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Setup" );
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_thread = _Thread_Get_executing();
+ ctx->runner_id = ctx->runner_thread->Object.id;
+
+ T_log( T_NORMAL, "Creating Worker Wakeup Semaphore" );
+ ctx->worker_wakeup = CreateWakeupSema();
+ T_log( T_NORMAL, "Creating Runner Wakeup Semaphore" );
+ ctx->runner_wakeup = CreateWakeupSema();
+
+ sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_sched );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident_by_processor( 1, &ctx->other_sched );
+ T_rsc_success( sc );
+ T_ne_u32( ctx->runner_sched, ctx->other_sched );
+ #endif
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_HIGH );
+
+ sc = rtems_task_construct( &WorkerConfig3, &ctx->worker_id );
+ T_log( T_NORMAL, "Construct Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+
+ T_log( T_NORMAL, "Starting Worker..." );
+ sc = rtems_task_start( ctx->worker_id, Worker3, (rtems_task_argument) ctx );
+ T_log( T_NORMAL, "Started Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+}
+
+
+static void RtemsModelEventsMgr_Setup_Wrap3( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Setup3( ctx );
+}
+
+
+static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance3;
+
+static T_fixture RtemsModelEventsMgr_Fixture3 = {
+ .setup = RtemsModelEventsMgr_Setup_Wrap3,
+ .stop = NULL,
+ .teardown = RtemsModelEventsMgr_Teardown_Wrap,
+ .scope = RtemsModelEventsMgr_Scope,
+ .initial_context = &RtemsModelEventsMgr_Instance3
+};
+
+static T_fixture_node RtemsModelEventsMgr_Node3;
+
+void RtemsModelEventsMgr_Run3(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+)
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ T_set_verbosity( T_NORMAL );
+
+ T_log( T_NORMAL, "Runner Invoked" );
+ T_log( T_NORMAL, "Runner Wait Class: %d", wait_class );
+ T_log( T_NORMAL, "Runner WaitForEvent: %d", waiting_for_event );
+
+ T_log( T_NORMAL, "Pushing Test Fixture..." );
+
+
+ ctx = T_push_fixture(
+ &RtemsModelEventsMgr_Node3,
+ &RtemsModelEventsMgr_Fixture3
+ );
+ // This runs RtemsModelEventsMgr_Fixture
+
+ T_log( T_NORMAL, "Test Fixture Pushed" );
+
+
+ ctx->send = send;
+ ctx->receive = receive;
+ ctx->get_pending_events = get_pending_events;
+ ctx->wait_class = wait_class;
+ ctx->waiting_for_event = waiting_for_event;
+
+ ctx->this_test_number = 3;
+
+ // RtemsModelEventsMgr_Prepare( ctx );
+ ctx->events_to_send = 0;
+ ctx->send_status = RTEMS_INCORRECT_STATE;
+ ctx->received_events = 0xffffffff;
+ ctx->receive_option_set = 0;
+ ctx->receive_timeout = RTEMS_NO_TIMEOUT;
+ ctx->unsatisfied_pending = 0xffffffff;
+ memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) );
+ T_eq_u32( GetPending( ctx ), 0 );
+ _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_STATE_READY );
+
+ TestSegment0( ctx );
+
+ Runner( ctx );
+
+ RtemsModelEventsMgr_Cleanup( ctx );
+
+ T_log( T_NORMAL, "Run Pop Fixture" );
+ ShowWorkerSemaId( ctx );
+ T_pop_fixture();
+ ShowWorkerSemaId( ctx );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-event-mgr-model-4.c b/testsuites/validation/tr-event-mgr-model-4.c
new file mode 100644
index 0000000000..250849d66c
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model-4.c
@@ -0,0 +1,361 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+
+#include "tr-event-mgr-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Event_Manager_TestGen
+// @@@ 0 DEF NO_OF_EVENTS 4
+#define NO_OF_EVENTS 4
+// @@@ 0 DEF EVTS_NONE 0
+#define EVTS_NONE 0
+// @@@ 0 DEF EVTS_PENDING 0
+#define EVTS_PENDING 0
+// @@@ 0 DEF EVT_0 1
+#define EVT_0 1
+// @@@ 0 DEF EVT_1 2
+#define EVT_1 2
+// @@@ 0 DEF EVT_2 4
+#define EVT_2 4
+// @@@ 0 DEF EVT_3 8
+#define EVT_3 8
+// @@@ 0 DEF NO_TIMEOUT 0
+#define NO_TIMEOUT 0
+// @@@ 0 DEF TASK_MAX 3
+#define TASK_MAX 3
+// @@@ 0 DEF BAD_ID 3
+#define BAD_ID 3
+// @@@ 0 DEF SEMA_MAX 2
+#define SEMA_MAX 2
+// @@@ 0 DEF RC_OK RTEMS_SUCCESSFUL
+#define RC_OK RTEMS_SUCCESSFUL
+// @@@ 0 DEF RC_InvId RTEMS_INVALID_ID
+#define RC_InvId RTEMS_INVALID_ID
+// @@@ 0 DEF RC_InvAddr RTEMS_INVALID_ADDRESS
+#define RC_InvAddr RTEMS_INVALID_ADDRESS
+// @@@ 0 DEF RC_Unsat RTEMS_UNSATISFIED
+#define RC_Unsat RTEMS_UNSATISFIED
+// @@@ 0 DEF RC_Timeout RTEMS_TIMEOUT
+#define RC_Timeout RTEMS_TIMEOUT
+// @@@ 0 DECL byte sendrc 0
+static rtems_status_code sendrc = 0;
+// @@@ 0 DECL byte recrc 0
+static rtems_status_code recrc = 0;
+// @@@ 0 DCLARRAY EvtSet pending TASK_MAX
+static rtems_event_set pending[TASK_MAX];
+// @@@ 0 DCLARRAY byte recout TASK_MAX
+static rtems_event_set recout[TASK_MAX];
+// @@@ 0 DCLARRAY Semaphore semaphore SEMA_MAX
+static rtems_id semaphore[SEMA_MAX];
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ /* Test Name is defined in the Test Case code (tc-model-events-mgr.c) */
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ initialise_pending( pending, TASK_MAX );
+ initialise_semaphore( ctx, semaphore );
+
+}
+
+// ===== TEST CODE SEGMENT 3 =====
+
+static void TestSegment3( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 3 TASK Worker");
+ checkTaskIs( ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 CALL EqualPriority");
+ SetSelfPriority( PRIO_NORMAL );
+ rtems_task_priority prio;
+ rtems_status_code sc;
+ sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_NORMAL );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 CALL StartLog");
+ T_thread_switch_log *log;
+ log = T_thread_switch_record_4( &ctx->thread_switch_log );
+
+ T_log(T_NORMAL,"@@@ 3 CALL event_send 1 2 14 sendrc");
+ T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 2), 14 );
+ sendrc = ( *ctx->send )( mapid( ctx, 2 ), 14 );
+ T_log( T_NORMAL, "Returned 0x%x from Send", sendrc );
+
+ T_log(T_NORMAL,"@@@ 3 CALL CheckNoPreemption");
+ log = &ctx->thread_switch_log;
+ T_le_sz( log->header.recorded, 1 );
+ for ( size_t i = 0; i < log->header.recorded; ++i ) {
+ T_ne_u32( log->events[ i ].executing, ctx->worker_id );
+ T_eq_u32( log->events[ i ].heir, ctx->runner_id );
+ }
+
+ T_log(T_NORMAL,"@@@ 3 SCALAR sendrc 0");
+ T_rsc( sendrc, 0 );
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Zombie");
+ /* Code to check that Task 1 has terminated */
+}
+
+// ===== TEST CODE SEGMENT 4 =====
+
+static void TestSegment4( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 4 TASK Runner");
+ checkTaskIs( ctx->runner_id );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 WAIT 1");
+ Wait( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 14");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 14 );
+
+ T_log(T_NORMAL,"@@@ 4 CALL event_receive 10 1 1 0 2 recrc");
+ T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 10, mergeopts( 1, 1 ) ,0 , 2 ? &recout[2] : NULL );
+ recrc = ( *ctx->receive )( 10, mergeopts( 1, 1 ), 0, 2 ? &recout[2] : NULL );
+ T_log( T_NORMAL, "Returned 0x%x from Receive", recrc );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR recrc 0");
+ T_rsc( recrc, 0 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR recout 2 10");
+ T_eq_int( recout[2], 10 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 4");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 4 );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Zombie");
+ /* Code to check that Task 2 has terminated */
+}
+
+// ===============================================
+
+
+
+static void Runner( RtemsModelEventsMgr_Context *ctx )
+{
+ T_log( T_NORMAL, "Runner running" );
+ TestSegment4( ctx );
+ T_log( T_NORMAL, "Runner finished" );
+}
+
+static void Worker4( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_event_set events;
+
+ ctx = (Context *) arg;
+
+ T_log( T_NORMAL, "Worker Running" );
+ TestSegment3( ctx );
+ T_log( T_NORMAL, "Worker finished" );
+
+ // (void) rtems_task_suspend( RTEMS_SELF );
+ // Ensure we hold no semaphores
+ Wakeup( ctx->worker_wakeup );
+ Wakeup( ctx->runner_wakeup );
+ // Wait for events so we don't terminate
+ rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_DEFAULT_OPTIONS, 0, &events );
+
+}
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage4[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ WORKER_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config WorkerConfig4 = {
+ .name = rtems_build_name( 'W', 'O', 'R', 'K' ),
+ .initial_priority = PRIO_LOW,
+ .storage_area = WorkerStorage4,
+ .storage_size = sizeof( WorkerStorage4 ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = WORKER_ATTRIBUTES
+};
+
+
+static void RtemsModelEventsMgr_Setup4(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Setup" );
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_thread = _Thread_Get_executing();
+ ctx->runner_id = ctx->runner_thread->Object.id;
+
+ T_log( T_NORMAL, "Creating Worker Wakeup Semaphore" );
+ ctx->worker_wakeup = CreateWakeupSema();
+ T_log( T_NORMAL, "Creating Runner Wakeup Semaphore" );
+ ctx->runner_wakeup = CreateWakeupSema();
+
+ sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_sched );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident_by_processor( 1, &ctx->other_sched );
+ T_rsc_success( sc );
+ T_ne_u32( ctx->runner_sched, ctx->other_sched );
+ #endif
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_HIGH );
+
+ sc = rtems_task_construct( &WorkerConfig4, &ctx->worker_id );
+ T_log( T_NORMAL, "Construct Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+
+ T_log( T_NORMAL, "Starting Worker..." );
+ sc = rtems_task_start( ctx->worker_id, Worker4, (rtems_task_argument) ctx );
+ T_log( T_NORMAL, "Started Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+}
+
+
+static void RtemsModelEventsMgr_Setup_Wrap4( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Setup4( ctx );
+}
+
+
+static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance4;
+
+static T_fixture RtemsModelEventsMgr_Fixture4 = {
+ .setup = RtemsModelEventsMgr_Setup_Wrap4,
+ .stop = NULL,
+ .teardown = RtemsModelEventsMgr_Teardown_Wrap,
+ .scope = RtemsModelEventsMgr_Scope,
+ .initial_context = &RtemsModelEventsMgr_Instance4
+};
+
+static T_fixture_node RtemsModelEventsMgr_Node4;
+
+void RtemsModelEventsMgr_Run4(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+)
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ T_set_verbosity( T_NORMAL );
+
+ T_log( T_NORMAL, "Runner Invoked" );
+ T_log( T_NORMAL, "Runner Wait Class: %d", wait_class );
+ T_log( T_NORMAL, "Runner WaitForEvent: %d", waiting_for_event );
+
+ T_log( T_NORMAL, "Pushing Test Fixture..." );
+
+
+ ctx = T_push_fixture(
+ &RtemsModelEventsMgr_Node4,
+ &RtemsModelEventsMgr_Fixture4
+ );
+ // This runs RtemsModelEventsMgr_Fixture
+
+ T_log( T_NORMAL, "Test Fixture Pushed" );
+
+
+ ctx->send = send;
+ ctx->receive = receive;
+ ctx->get_pending_events = get_pending_events;
+ ctx->wait_class = wait_class;
+ ctx->waiting_for_event = waiting_for_event;
+
+ ctx->this_test_number = 4;
+
+ // RtemsModelEventsMgr_Prepare( ctx );
+ ctx->events_to_send = 0;
+ ctx->send_status = RTEMS_INCORRECT_STATE;
+ ctx->received_events = 0xffffffff;
+ ctx->receive_option_set = 0;
+ ctx->receive_timeout = RTEMS_NO_TIMEOUT;
+ ctx->unsatisfied_pending = 0xffffffff;
+ memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) );
+ T_eq_u32( GetPending( ctx ), 0 );
+ _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_STATE_READY );
+
+ TestSegment0( ctx );
+
+ Runner( ctx );
+
+ RtemsModelEventsMgr_Cleanup( ctx );
+
+ T_log( T_NORMAL, "Run Pop Fixture" );
+ ShowWorkerSemaId( ctx );
+ T_pop_fixture();
+ ShowWorkerSemaId( ctx );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-event-mgr-model-5.c b/testsuites/validation/tr-event-mgr-model-5.c
new file mode 100644
index 0000000000..19f07fce4e
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model-5.c
@@ -0,0 +1,361 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+
+#include "tr-event-mgr-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Event_Manager_TestGen
+// @@@ 0 DEF NO_OF_EVENTS 4
+#define NO_OF_EVENTS 4
+// @@@ 0 DEF EVTS_NONE 0
+#define EVTS_NONE 0
+// @@@ 0 DEF EVTS_PENDING 0
+#define EVTS_PENDING 0
+// @@@ 0 DEF EVT_0 1
+#define EVT_0 1
+// @@@ 0 DEF EVT_1 2
+#define EVT_1 2
+// @@@ 0 DEF EVT_2 4
+#define EVT_2 4
+// @@@ 0 DEF EVT_3 8
+#define EVT_3 8
+// @@@ 0 DEF NO_TIMEOUT 0
+#define NO_TIMEOUT 0
+// @@@ 0 DEF TASK_MAX 3
+#define TASK_MAX 3
+// @@@ 0 DEF BAD_ID 3
+#define BAD_ID 3
+// @@@ 0 DEF SEMA_MAX 2
+#define SEMA_MAX 2
+// @@@ 0 DEF RC_OK RTEMS_SUCCESSFUL
+#define RC_OK RTEMS_SUCCESSFUL
+// @@@ 0 DEF RC_InvId RTEMS_INVALID_ID
+#define RC_InvId RTEMS_INVALID_ID
+// @@@ 0 DEF RC_InvAddr RTEMS_INVALID_ADDRESS
+#define RC_InvAddr RTEMS_INVALID_ADDRESS
+// @@@ 0 DEF RC_Unsat RTEMS_UNSATISFIED
+#define RC_Unsat RTEMS_UNSATISFIED
+// @@@ 0 DEF RC_Timeout RTEMS_TIMEOUT
+#define RC_Timeout RTEMS_TIMEOUT
+// @@@ 0 DECL byte sendrc 0
+static rtems_status_code sendrc = 0;
+// @@@ 0 DECL byte recrc 0
+static rtems_status_code recrc = 0;
+// @@@ 0 DCLARRAY EvtSet pending TASK_MAX
+static rtems_event_set pending[TASK_MAX];
+// @@@ 0 DCLARRAY byte recout TASK_MAX
+static rtems_event_set recout[TASK_MAX];
+// @@@ 0 DCLARRAY Semaphore semaphore SEMA_MAX
+static rtems_id semaphore[SEMA_MAX];
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ /* Test Name is defined in the Test Case code (tc-model-events-mgr.c) */
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ initialise_pending( pending, TASK_MAX );
+ initialise_semaphore( ctx, semaphore );
+
+}
+
+// ===== TEST CODE SEGMENT 3 =====
+
+static void TestSegment3( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 3 TASK Worker");
+ checkTaskIs( ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 CALL EqualPriority");
+ SetSelfPriority( PRIO_NORMAL );
+ rtems_task_priority prio;
+ rtems_status_code sc;
+ sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_NORMAL );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 CALL StartLog");
+ T_thread_switch_log *log;
+ log = T_thread_switch_record_4( &ctx->thread_switch_log );
+
+ T_log(T_NORMAL,"@@@ 3 CALL event_send 1 2 11 sendrc");
+ T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 2), 11 );
+ sendrc = ( *ctx->send )( mapid( ctx, 2 ), 11 );
+ T_log( T_NORMAL, "Returned 0x%x from Send", sendrc );
+
+ T_log(T_NORMAL,"@@@ 3 CALL CheckNoPreemption");
+ log = &ctx->thread_switch_log;
+ T_le_sz( log->header.recorded, 1 );
+ for ( size_t i = 0; i < log->header.recorded; ++i ) {
+ T_ne_u32( log->events[ i ].executing, ctx->worker_id );
+ T_eq_u32( log->events[ i ].heir, ctx->runner_id );
+ }
+
+ T_log(T_NORMAL,"@@@ 3 SCALAR sendrc 0");
+ T_rsc( sendrc, 0 );
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Zombie");
+ /* Code to check that Task 1 has terminated */
+}
+
+// ===== TEST CODE SEGMENT 4 =====
+
+static void TestSegment4( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 4 TASK Runner");
+ checkTaskIs( ctx->runner_id );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 WAIT 1");
+ Wait( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 11");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 11 );
+
+ T_log(T_NORMAL,"@@@ 4 CALL event_receive 10 1 1 0 2 recrc");
+ T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 10, mergeopts( 1, 1 ) ,0 , 2 ? &recout[2] : NULL );
+ recrc = ( *ctx->receive )( 10, mergeopts( 1, 1 ), 0, 2 ? &recout[2] : NULL );
+ T_log( T_NORMAL, "Returned 0x%x from Receive", recrc );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR recrc 0");
+ T_rsc( recrc, 0 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR recout 2 10");
+ T_eq_int( recout[2], 10 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 1");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 1 );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Zombie");
+ /* Code to check that Task 2 has terminated */
+}
+
+// ===============================================
+
+
+
+static void Runner( RtemsModelEventsMgr_Context *ctx )
+{
+ T_log( T_NORMAL, "Runner running" );
+ TestSegment4( ctx );
+ T_log( T_NORMAL, "Runner finished" );
+}
+
+static void Worker5( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_event_set events;
+
+ ctx = (Context *) arg;
+
+ T_log( T_NORMAL, "Worker Running" );
+ TestSegment3( ctx );
+ T_log( T_NORMAL, "Worker finished" );
+
+ // (void) rtems_task_suspend( RTEMS_SELF );
+ // Ensure we hold no semaphores
+ Wakeup( ctx->worker_wakeup );
+ Wakeup( ctx->runner_wakeup );
+ // Wait for events so we don't terminate
+ rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_DEFAULT_OPTIONS, 0, &events );
+
+}
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage5[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ WORKER_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config WorkerConfig5 = {
+ .name = rtems_build_name( 'W', 'O', 'R', 'K' ),
+ .initial_priority = PRIO_LOW,
+ .storage_area = WorkerStorage5,
+ .storage_size = sizeof( WorkerStorage5 ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = WORKER_ATTRIBUTES
+};
+
+
+static void RtemsModelEventsMgr_Setup5(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Setup" );
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_thread = _Thread_Get_executing();
+ ctx->runner_id = ctx->runner_thread->Object.id;
+
+ T_log( T_NORMAL, "Creating Worker Wakeup Semaphore" );
+ ctx->worker_wakeup = CreateWakeupSema();
+ T_log( T_NORMAL, "Creating Runner Wakeup Semaphore" );
+ ctx->runner_wakeup = CreateWakeupSema();
+
+ sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_sched );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident_by_processor( 1, &ctx->other_sched );
+ T_rsc_success( sc );
+ T_ne_u32( ctx->runner_sched, ctx->other_sched );
+ #endif
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_HIGH );
+
+ sc = rtems_task_construct( &WorkerConfig5, &ctx->worker_id );
+ T_log( T_NORMAL, "Construct Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+
+ T_log( T_NORMAL, "Starting Worker..." );
+ sc = rtems_task_start( ctx->worker_id, Worker5, (rtems_task_argument) ctx );
+ T_log( T_NORMAL, "Started Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+}
+
+
+static void RtemsModelEventsMgr_Setup_Wrap5( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Setup5( ctx );
+}
+
+
+static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance5;
+
+static T_fixture RtemsModelEventsMgr_Fixture5 = {
+ .setup = RtemsModelEventsMgr_Setup_Wrap5,
+ .stop = NULL,
+ .teardown = RtemsModelEventsMgr_Teardown_Wrap,
+ .scope = RtemsModelEventsMgr_Scope,
+ .initial_context = &RtemsModelEventsMgr_Instance5
+};
+
+static T_fixture_node RtemsModelEventsMgr_Node5;
+
+void RtemsModelEventsMgr_Run5(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+)
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ T_set_verbosity( T_NORMAL );
+
+ T_log( T_NORMAL, "Runner Invoked" );
+ T_log( T_NORMAL, "Runner Wait Class: %d", wait_class );
+ T_log( T_NORMAL, "Runner WaitForEvent: %d", waiting_for_event );
+
+ T_log( T_NORMAL, "Pushing Test Fixture..." );
+
+
+ ctx = T_push_fixture(
+ &RtemsModelEventsMgr_Node5,
+ &RtemsModelEventsMgr_Fixture5
+ );
+ // This runs RtemsModelEventsMgr_Fixture
+
+ T_log( T_NORMAL, "Test Fixture Pushed" );
+
+
+ ctx->send = send;
+ ctx->receive = receive;
+ ctx->get_pending_events = get_pending_events;
+ ctx->wait_class = wait_class;
+ ctx->waiting_for_event = waiting_for_event;
+
+ ctx->this_test_number = 5;
+
+ // RtemsModelEventsMgr_Prepare( ctx );
+ ctx->events_to_send = 0;
+ ctx->send_status = RTEMS_INCORRECT_STATE;
+ ctx->received_events = 0xffffffff;
+ ctx->receive_option_set = 0;
+ ctx->receive_timeout = RTEMS_NO_TIMEOUT;
+ ctx->unsatisfied_pending = 0xffffffff;
+ memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) );
+ T_eq_u32( GetPending( ctx ), 0 );
+ _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_STATE_READY );
+
+ TestSegment0( ctx );
+
+ Runner( ctx );
+
+ RtemsModelEventsMgr_Cleanup( ctx );
+
+ T_log( T_NORMAL, "Run Pop Fixture" );
+ ShowWorkerSemaId( ctx );
+ T_pop_fixture();
+ ShowWorkerSemaId( ctx );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-event-mgr-model-6.c b/testsuites/validation/tr-event-mgr-model-6.c
new file mode 100644
index 0000000000..5d9807781c
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model-6.c
@@ -0,0 +1,383 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+
+#include "tr-event-mgr-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Event_Manager_TestGen
+// @@@ 0 DEF NO_OF_EVENTS 4
+#define NO_OF_EVENTS 4
+// @@@ 0 DEF EVTS_NONE 0
+#define EVTS_NONE 0
+// @@@ 0 DEF EVTS_PENDING 0
+#define EVTS_PENDING 0
+// @@@ 0 DEF EVT_0 1
+#define EVT_0 1
+// @@@ 0 DEF EVT_1 2
+#define EVT_1 2
+// @@@ 0 DEF EVT_2 4
+#define EVT_2 4
+// @@@ 0 DEF EVT_3 8
+#define EVT_3 8
+// @@@ 0 DEF NO_TIMEOUT 0
+#define NO_TIMEOUT 0
+// @@@ 0 DEF TASK_MAX 3
+#define TASK_MAX 3
+// @@@ 0 DEF BAD_ID 3
+#define BAD_ID 3
+// @@@ 0 DEF SEMA_MAX 2
+#define SEMA_MAX 2
+// @@@ 0 DEF RC_OK RTEMS_SUCCESSFUL
+#define RC_OK RTEMS_SUCCESSFUL
+// @@@ 0 DEF RC_InvId RTEMS_INVALID_ID
+#define RC_InvId RTEMS_INVALID_ID
+// @@@ 0 DEF RC_InvAddr RTEMS_INVALID_ADDRESS
+#define RC_InvAddr RTEMS_INVALID_ADDRESS
+// @@@ 0 DEF RC_Unsat RTEMS_UNSATISFIED
+#define RC_Unsat RTEMS_UNSATISFIED
+// @@@ 0 DEF RC_Timeout RTEMS_TIMEOUT
+#define RC_Timeout RTEMS_TIMEOUT
+// @@@ 0 DECL byte sendrc 0
+static rtems_status_code sendrc = 0;
+// @@@ 0 DECL byte recrc 0
+static rtems_status_code recrc = 0;
+// @@@ 0 DCLARRAY EvtSet pending TASK_MAX
+static rtems_event_set pending[TASK_MAX];
+// @@@ 0 DCLARRAY byte recout TASK_MAX
+static rtems_event_set recout[TASK_MAX];
+// @@@ 0 DCLARRAY Semaphore semaphore SEMA_MAX
+static rtems_id semaphore[SEMA_MAX];
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ /* Test Name is defined in the Test Case code (tc-model-events-mgr.c) */
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ initialise_pending( pending, TASK_MAX );
+ initialise_semaphore( ctx, semaphore );
+
+}
+
+// ===== TEST CODE SEGMENT 1 =====
+
+static void TestSegment1( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 1 STATE 1 Ready");
+ /* We (Task 1) must have been recently ready because we are running */
+
+}
+
+// ===== TEST CODE SEGMENT 3 =====
+
+static void TestSegment3( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 3 TASK Worker");
+ checkTaskIs( ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 CALL LowerPriority");
+ SetSelfPriority( PRIO_LOW );
+ rtems_task_priority prio;
+ rtems_status_code sc;
+ sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_LOW );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 CALL StartLog");
+ T_thread_switch_log *log;
+ log = T_thread_switch_record_4( &ctx->thread_switch_log );
+
+ T_log(T_NORMAL,"@@@ 3 CALL event_send 1 2 10 sendrc");
+ T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 2), 10 );
+ sendrc = ( *ctx->send )( mapid( ctx, 2 ), 10 );
+ T_log( T_NORMAL, "Returned 0x%x from Send", sendrc );
+
+ T_log(T_NORMAL,"@@@ 3 CALL CheckPreemption");
+ log = &ctx->thread_switch_log;
+ T_eq_sz( log->header.recorded, 2 );
+ T_eq_u32( log->events[ 0 ].heir, ctx->runner_id );
+ T_eq_u32( log->events[ 1 ].heir, ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 2 Ready");
+ /* We (Task 2) must have been recently ready because we are running */
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 OtherWait");
+ /* Code to check that Task 1 is waiting (after pre-emption) */
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Ready");
+ /* We (Task 1) must have been recently ready because we are running */
+
+ T_log(T_NORMAL,"@@@ 3 SCALAR sendrc 0");
+ T_rsc( sendrc, 0 );
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Zombie");
+ /* Code to check that Task 1 has terminated */
+}
+
+// ===== TEST CODE SEGMENT 4 =====
+
+static void TestSegment4( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 4 TASK Runner");
+ checkTaskIs( ctx->runner_id );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 WAIT 1");
+ Wait( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 CALL event_receive 10 1 1 0 2 recrc");
+ T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 10, mergeopts( 1, 1 ) ,0 , 2 ? &recout[2] : NULL );
+ recrc = ( *ctx->receive )( 10, mergeopts( 1, 1 ), 0, 2 ? &recout[2] : NULL );
+ T_log( T_NORMAL, "Returned 0x%x from Receive", recrc );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 EventWait");
+ /* Code to check that Task 2 is waiting on events */
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Ready");
+ /* We (Task 2) must have been recently ready because we are running */
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR recrc 0");
+ T_rsc( recrc, 0 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR recout 2 10");
+ T_eq_int( recout[2], 10 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Zombie");
+ /* Code to check that Task 2 has terminated */
+}
+
+// ===============================================
+
+
+
+static void Runner( RtemsModelEventsMgr_Context *ctx )
+{
+ T_log( T_NORMAL, "Runner running" );
+ TestSegment4( ctx );
+ T_log( T_NORMAL, "Runner finished" );
+}
+
+static void Worker6( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_event_set events;
+
+ ctx = (Context *) arg;
+
+ T_log( T_NORMAL, "Worker Running" );
+ TestSegment3( ctx );
+ T_log( T_NORMAL, "Worker finished" );
+
+ // (void) rtems_task_suspend( RTEMS_SELF );
+ // Ensure we hold no semaphores
+ Wakeup( ctx->worker_wakeup );
+ Wakeup( ctx->runner_wakeup );
+ // Wait for events so we don't terminate
+ rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_DEFAULT_OPTIONS, 0, &events );
+
+}
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage6[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ WORKER_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config WorkerConfig6 = {
+ .name = rtems_build_name( 'W', 'O', 'R', 'K' ),
+ .initial_priority = PRIO_LOW,
+ .storage_area = WorkerStorage6,
+ .storage_size = sizeof( WorkerStorage6 ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = WORKER_ATTRIBUTES
+};
+
+
+static void RtemsModelEventsMgr_Setup6(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Setup" );
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_thread = _Thread_Get_executing();
+ ctx->runner_id = ctx->runner_thread->Object.id;
+
+ T_log( T_NORMAL, "Creating Worker Wakeup Semaphore" );
+ ctx->worker_wakeup = CreateWakeupSema();
+ T_log( T_NORMAL, "Creating Runner Wakeup Semaphore" );
+ ctx->runner_wakeup = CreateWakeupSema();
+
+ sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_sched );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident_by_processor( 1, &ctx->other_sched );
+ T_rsc_success( sc );
+ T_ne_u32( ctx->runner_sched, ctx->other_sched );
+ #endif
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_HIGH );
+
+ sc = rtems_task_construct( &WorkerConfig6, &ctx->worker_id );
+ T_log( T_NORMAL, "Construct Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+
+ T_log( T_NORMAL, "Starting Worker..." );
+ sc = rtems_task_start( ctx->worker_id, Worker6, (rtems_task_argument) ctx );
+ T_log( T_NORMAL, "Started Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+}
+
+
+static void RtemsModelEventsMgr_Setup_Wrap6( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Setup6( ctx );
+}
+
+
+static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance6;
+
+static T_fixture RtemsModelEventsMgr_Fixture6 = {
+ .setup = RtemsModelEventsMgr_Setup_Wrap6,
+ .stop = NULL,
+ .teardown = RtemsModelEventsMgr_Teardown_Wrap,
+ .scope = RtemsModelEventsMgr_Scope,
+ .initial_context = &RtemsModelEventsMgr_Instance6
+};
+
+static T_fixture_node RtemsModelEventsMgr_Node6;
+
+void RtemsModelEventsMgr_Run6(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+)
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ T_set_verbosity( T_NORMAL );
+
+ T_log( T_NORMAL, "Runner Invoked" );
+ T_log( T_NORMAL, "Runner Wait Class: %d", wait_class );
+ T_log( T_NORMAL, "Runner WaitForEvent: %d", waiting_for_event );
+
+ T_log( T_NORMAL, "Pushing Test Fixture..." );
+
+
+ ctx = T_push_fixture(
+ &RtemsModelEventsMgr_Node6,
+ &RtemsModelEventsMgr_Fixture6
+ );
+ // This runs RtemsModelEventsMgr_Fixture
+
+ T_log( T_NORMAL, "Test Fixture Pushed" );
+
+
+ ctx->send = send;
+ ctx->receive = receive;
+ ctx->get_pending_events = get_pending_events;
+ ctx->wait_class = wait_class;
+ ctx->waiting_for_event = waiting_for_event;
+
+ ctx->this_test_number = 6;
+
+ // RtemsModelEventsMgr_Prepare( ctx );
+ ctx->events_to_send = 0;
+ ctx->send_status = RTEMS_INCORRECT_STATE;
+ ctx->received_events = 0xffffffff;
+ ctx->receive_option_set = 0;
+ ctx->receive_timeout = RTEMS_NO_TIMEOUT;
+ ctx->unsatisfied_pending = 0xffffffff;
+ memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) );
+ T_eq_u32( GetPending( ctx ), 0 );
+ _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_STATE_READY );
+
+ TestSegment0( ctx );
+
+ Runner( ctx );
+
+ RtemsModelEventsMgr_Cleanup( ctx );
+
+ T_log( T_NORMAL, "Run Pop Fixture" );
+ ShowWorkerSemaId( ctx );
+ T_pop_fixture();
+ ShowWorkerSemaId( ctx );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-event-mgr-model-7.c b/testsuites/validation/tr-event-mgr-model-7.c
new file mode 100644
index 0000000000..b3da580104
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model-7.c
@@ -0,0 +1,388 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+
+#include "tr-event-mgr-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Event_Manager_TestGen
+// @@@ 0 DEF NO_OF_EVENTS 4
+#define NO_OF_EVENTS 4
+// @@@ 0 DEF EVTS_NONE 0
+#define EVTS_NONE 0
+// @@@ 0 DEF EVTS_PENDING 0
+#define EVTS_PENDING 0
+// @@@ 0 DEF EVT_0 1
+#define EVT_0 1
+// @@@ 0 DEF EVT_1 2
+#define EVT_1 2
+// @@@ 0 DEF EVT_2 4
+#define EVT_2 4
+// @@@ 0 DEF EVT_3 8
+#define EVT_3 8
+// @@@ 0 DEF NO_TIMEOUT 0
+#define NO_TIMEOUT 0
+// @@@ 0 DEF TASK_MAX 3
+#define TASK_MAX 3
+// @@@ 0 DEF BAD_ID 3
+#define BAD_ID 3
+// @@@ 0 DEF SEMA_MAX 2
+#define SEMA_MAX 2
+// @@@ 0 DEF RC_OK RTEMS_SUCCESSFUL
+#define RC_OK RTEMS_SUCCESSFUL
+// @@@ 0 DEF RC_InvId RTEMS_INVALID_ID
+#define RC_InvId RTEMS_INVALID_ID
+// @@@ 0 DEF RC_InvAddr RTEMS_INVALID_ADDRESS
+#define RC_InvAddr RTEMS_INVALID_ADDRESS
+// @@@ 0 DEF RC_Unsat RTEMS_UNSATISFIED
+#define RC_Unsat RTEMS_UNSATISFIED
+// @@@ 0 DEF RC_Timeout RTEMS_TIMEOUT
+#define RC_Timeout RTEMS_TIMEOUT
+// @@@ 0 DECL byte sendrc 0
+static rtems_status_code sendrc = 0;
+// @@@ 0 DECL byte recrc 0
+static rtems_status_code recrc = 0;
+// @@@ 0 DCLARRAY EvtSet pending TASK_MAX
+static rtems_event_set pending[TASK_MAX];
+// @@@ 0 DCLARRAY byte recout TASK_MAX
+static rtems_event_set recout[TASK_MAX];
+// @@@ 0 DCLARRAY Semaphore semaphore SEMA_MAX
+static rtems_id semaphore[SEMA_MAX];
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ /* Test Name is defined in the Test Case code (tc-model-events-mgr.c) */
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ initialise_pending( pending, TASK_MAX );
+ initialise_semaphore( ctx, semaphore );
+
+}
+
+// ===== TEST CODE SEGMENT 3 =====
+
+static void TestSegment3( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 3 TASK Worker");
+ checkTaskIs( ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 CALL EqualPriority");
+ SetSelfPriority( PRIO_NORMAL );
+ rtems_task_priority prio;
+ rtems_status_code sc;
+ sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_NORMAL );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 CALL StartLog");
+ T_thread_switch_log *log;
+ log = T_thread_switch_record_4( &ctx->thread_switch_log );
+
+ T_log(T_NORMAL,"@@@ 3 CALL event_send 1 2 2 sendrc");
+ T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 2), 2 );
+ sendrc = ( *ctx->send )( mapid( ctx, 2 ), 2 );
+ T_log( T_NORMAL, "Returned 0x%x from Send", sendrc );
+
+ T_log(T_NORMAL,"@@@ 3 CALL CheckNoPreemption");
+ log = &ctx->thread_switch_log;
+ T_le_sz( log->header.recorded, 1 );
+ for ( size_t i = 0; i < log->header.recorded; ++i ) {
+ T_ne_u32( log->events[ i ].executing, ctx->worker_id );
+ T_eq_u32( log->events[ i ].heir, ctx->runner_id );
+ }
+
+ T_log(T_NORMAL,"@@@ 3 SCALAR sendrc 0");
+ T_rsc( sendrc, 0 );
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 CALL event_send 1 2 8 sendrc");
+ T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 2), 8 );
+ sendrc = ( *ctx->send )( mapid( ctx, 2 ), 8 );
+ T_log( T_NORMAL, "Returned 0x%x from Send", sendrc );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 2 Ready");
+ /* We (Task 2) must have been recently ready because we are running */
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Ready");
+ /* We (Task 1) must have been recently ready because we are running */
+
+ T_log(T_NORMAL,"@@@ 3 SCALAR sendrc 0");
+ T_rsc( sendrc, 0 );
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Zombie");
+ /* Code to check that Task 1 has terminated */
+}
+
+// ===== TEST CODE SEGMENT 4 =====
+
+static void TestSegment4( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 4 TASK Runner");
+ checkTaskIs( ctx->runner_id );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 WAIT 1");
+ Wait( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 2");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 2 );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 CALL event_receive 10 1 1 0 2 recrc");
+ T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 10, mergeopts( 1, 1 ) ,0 , 2 ? &recout[2] : NULL );
+ recrc = ( *ctx->receive )( 10, mergeopts( 1, 1 ), 0, 2 ? &recout[2] : NULL );
+ T_log( T_NORMAL, "Returned 0x%x from Receive", recrc );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 EventWait");
+ /* Code to check that Task 2 is waiting on events */
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Ready");
+ /* We (Task 2) must have been recently ready because we are running */
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR recrc 0");
+ T_rsc( recrc, 0 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR recout 2 10");
+ T_eq_int( recout[2], 10 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Zombie");
+ /* Code to check that Task 2 has terminated */
+}
+
+// ===============================================
+
+
+
+static void Runner( RtemsModelEventsMgr_Context *ctx )
+{
+ T_log( T_NORMAL, "Runner running" );
+ TestSegment4( ctx );
+ T_log( T_NORMAL, "Runner finished" );
+}
+
+static void Worker7( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_event_set events;
+
+ ctx = (Context *) arg;
+
+ T_log( T_NORMAL, "Worker Running" );
+ TestSegment3( ctx );
+ T_log( T_NORMAL, "Worker finished" );
+
+ // (void) rtems_task_suspend( RTEMS_SELF );
+ // Ensure we hold no semaphores
+ Wakeup( ctx->worker_wakeup );
+ Wakeup( ctx->runner_wakeup );
+ // Wait for events so we don't terminate
+ rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_DEFAULT_OPTIONS, 0, &events );
+
+}
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage7[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ WORKER_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config WorkerConfig7 = {
+ .name = rtems_build_name( 'W', 'O', 'R', 'K' ),
+ .initial_priority = PRIO_LOW,
+ .storage_area = WorkerStorage7,
+ .storage_size = sizeof( WorkerStorage7 ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = WORKER_ATTRIBUTES
+};
+
+
+static void RtemsModelEventsMgr_Setup7(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Setup" );
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_thread = _Thread_Get_executing();
+ ctx->runner_id = ctx->runner_thread->Object.id;
+
+ T_log( T_NORMAL, "Creating Worker Wakeup Semaphore" );
+ ctx->worker_wakeup = CreateWakeupSema();
+ T_log( T_NORMAL, "Creating Runner Wakeup Semaphore" );
+ ctx->runner_wakeup = CreateWakeupSema();
+
+ sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_sched );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident_by_processor( 1, &ctx->other_sched );
+ T_rsc_success( sc );
+ T_ne_u32( ctx->runner_sched, ctx->other_sched );
+ #endif
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_HIGH );
+
+ sc = rtems_task_construct( &WorkerConfig7, &ctx->worker_id );
+ T_log( T_NORMAL, "Construct Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+
+ T_log( T_NORMAL, "Starting Worker..." );
+ sc = rtems_task_start( ctx->worker_id, Worker7, (rtems_task_argument) ctx );
+ T_log( T_NORMAL, "Started Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+}
+
+
+static void RtemsModelEventsMgr_Setup_Wrap7( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Setup7( ctx );
+}
+
+
+static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance7;
+
+static T_fixture RtemsModelEventsMgr_Fixture7 = {
+ .setup = RtemsModelEventsMgr_Setup_Wrap7,
+ .stop = NULL,
+ .teardown = RtemsModelEventsMgr_Teardown_Wrap,
+ .scope = RtemsModelEventsMgr_Scope,
+ .initial_context = &RtemsModelEventsMgr_Instance7
+};
+
+static T_fixture_node RtemsModelEventsMgr_Node7;
+
+void RtemsModelEventsMgr_Run7(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+)
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ T_set_verbosity( T_NORMAL );
+
+ T_log( T_NORMAL, "Runner Invoked" );
+ T_log( T_NORMAL, "Runner Wait Class: %d", wait_class );
+ T_log( T_NORMAL, "Runner WaitForEvent: %d", waiting_for_event );
+
+ T_log( T_NORMAL, "Pushing Test Fixture..." );
+
+
+ ctx = T_push_fixture(
+ &RtemsModelEventsMgr_Node7,
+ &RtemsModelEventsMgr_Fixture7
+ );
+ // This runs RtemsModelEventsMgr_Fixture
+
+ T_log( T_NORMAL, "Test Fixture Pushed" );
+
+
+ ctx->send = send;
+ ctx->receive = receive;
+ ctx->get_pending_events = get_pending_events;
+ ctx->wait_class = wait_class;
+ ctx->waiting_for_event = waiting_for_event;
+
+ ctx->this_test_number = 7;
+
+ // RtemsModelEventsMgr_Prepare( ctx );
+ ctx->events_to_send = 0;
+ ctx->send_status = RTEMS_INCORRECT_STATE;
+ ctx->received_events = 0xffffffff;
+ ctx->receive_option_set = 0;
+ ctx->receive_timeout = RTEMS_NO_TIMEOUT;
+ ctx->unsatisfied_pending = 0xffffffff;
+ memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) );
+ T_eq_u32( GetPending( ctx ), 0 );
+ _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_STATE_READY );
+
+ TestSegment0( ctx );
+
+ Runner( ctx );
+
+ RtemsModelEventsMgr_Cleanup( ctx );
+
+ T_log( T_NORMAL, "Run Pop Fixture" );
+ ShowWorkerSemaId( ctx );
+ T_pop_fixture();
+ ShowWorkerSemaId( ctx );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-event-mgr-model-8.c b/testsuites/validation/tr-event-mgr-model-8.c
new file mode 100644
index 0000000000..fe46ba013a
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model-8.c
@@ -0,0 +1,375 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifndef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+
+#include "tr-event-mgr-model.h"
+
+// ===============================================
+
+// @@@ 0 NAME Event_Manager_TestGen
+// @@@ 0 DEF NO_OF_EVENTS 4
+#define NO_OF_EVENTS 4
+// @@@ 0 DEF EVTS_NONE 0
+#define EVTS_NONE 0
+// @@@ 0 DEF EVTS_PENDING 0
+#define EVTS_PENDING 0
+// @@@ 0 DEF EVT_0 1
+#define EVT_0 1
+// @@@ 0 DEF EVT_1 2
+#define EVT_1 2
+// @@@ 0 DEF EVT_2 4
+#define EVT_2 4
+// @@@ 0 DEF EVT_3 8
+#define EVT_3 8
+// @@@ 0 DEF NO_TIMEOUT 0
+#define NO_TIMEOUT 0
+// @@@ 0 DEF TASK_MAX 3
+#define TASK_MAX 3
+// @@@ 0 DEF BAD_ID 3
+#define BAD_ID 3
+// @@@ 0 DEF SEMA_MAX 2
+#define SEMA_MAX 2
+// @@@ 0 DEF RC_OK RTEMS_SUCCESSFUL
+#define RC_OK RTEMS_SUCCESSFUL
+// @@@ 0 DEF RC_InvId RTEMS_INVALID_ID
+#define RC_InvId RTEMS_INVALID_ID
+// @@@ 0 DEF RC_InvAddr RTEMS_INVALID_ADDRESS
+#define RC_InvAddr RTEMS_INVALID_ADDRESS
+// @@@ 0 DEF RC_Unsat RTEMS_UNSATISFIED
+#define RC_Unsat RTEMS_UNSATISFIED
+// @@@ 0 DEF RC_Timeout RTEMS_TIMEOUT
+#define RC_Timeout RTEMS_TIMEOUT
+// @@@ 0 DECL byte sendrc 0
+static rtems_status_code sendrc = 0;
+// @@@ 0 DECL byte recrc 0
+static rtems_status_code recrc = 0;
+// @@@ 0 DCLARRAY EvtSet pending TASK_MAX
+static rtems_event_set pending[TASK_MAX];
+// @@@ 0 DCLARRAY byte recout TASK_MAX
+static rtems_event_set recout[TASK_MAX];
+// @@@ 0 DCLARRAY Semaphore semaphore SEMA_MAX
+static rtems_id semaphore[SEMA_MAX];
+
+// ===== TEST CODE SEGMENT 0 =====
+
+static void TestSegment0( Context* ctx ) {
+ /* Test Name is defined in the Test Case code (tc-model-events-mgr.c) */
+
+ T_log(T_NORMAL,"@@@ 0 INIT");
+ initialise_pending( pending, TASK_MAX );
+ initialise_semaphore( ctx, semaphore );
+
+}
+
+// ===== TEST CODE SEGMENT 3 =====
+
+static void TestSegment3( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 3 TASK Worker");
+ checkTaskIs( ctx->worker_id );
+
+ T_log(T_NORMAL,"@@@ 3 CALL SetProcessor 1");
+ T_ge_u32( rtems_scheduler_get_processor_maximum(), 2 );
+ uint32_t processor = 1;
+ cpu_set_t cpuset;
+ CPU_ZERO(&cpuset);
+ CPU_SET(processor, &cpuset);
+
+ T_log(T_NORMAL,"@@@ 3 CALL EqualPriority");
+ SetSelfPriority( PRIO_NORMAL );
+ rtems_task_priority prio;
+ rtems_status_code sc;
+ sc = rtems_task_set_priority( RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_NORMAL );
+
+ T_log(T_NORMAL,"@@@ 3 WAIT 0");
+ Wait( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 3 CALL StartLog");
+ T_thread_switch_log *log;
+ log = T_thread_switch_record_4( &ctx->thread_switch_log );
+
+ T_log(T_NORMAL,"@@@ 3 CALL event_send 1 2 10 sendrc");
+ T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 2), 10 );
+ sendrc = ( *ctx->send )( mapid( ctx, 2 ), 10 );
+ T_log( T_NORMAL, "Returned 0x%x from Send", sendrc );
+
+ T_log(T_NORMAL,"@@@ 3 CALL CheckNoPreemption");
+ log = &ctx->thread_switch_log;
+ T_le_sz( log->header.recorded, 1 );
+ for ( size_t i = 0; i < log->header.recorded; ++i ) {
+ T_ne_u32( log->events[ i ].executing, ctx->worker_id );
+ T_eq_u32( log->events[ i ].heir, ctx->runner_id );
+ }
+
+ T_log(T_NORMAL,"@@@ 3 SCALAR sendrc 0");
+ T_rsc( sendrc, 0 );
+ T_log(T_NORMAL,"@@@ 3 SIGNAL 1");
+ Wakeup( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 3 STATE 1 Zombie");
+ /* Code to check that Task 1 has terminated */
+}
+
+// ===== TEST CODE SEGMENT 4 =====
+
+static void TestSegment4( Context* ctx ) {
+ T_log(T_NORMAL,"@@@ 4 TASK Runner");
+ checkTaskIs( ctx->runner_id );
+
+ T_log(T_NORMAL,"@@@ 4 CALL SetProcessor 0");
+ T_ge_u32( rtems_scheduler_get_processor_maximum(), 2 );
+ uint32_t processor = 0;
+ cpu_set_t cpuset;
+ CPU_ZERO(&cpuset);
+ CPU_SET(processor, &cpuset);
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 WAIT 1");
+ Wait( semaphore[1] );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 10");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 10 );
+
+ T_log(T_NORMAL,"@@@ 4 CALL event_receive 10 1 1 0 2 recrc");
+ T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 10, mergeopts( 1, 1 ) ,0 , 2 ? &recout[2] : NULL );
+ recrc = ( *ctx->receive )( 10, mergeopts( 1, 1 ), 0, 2 ? &recout[2] : NULL );
+ T_log( T_NORMAL, "Returned 0x%x from Receive", recrc );
+
+ T_log(T_NORMAL,"@@@ 4 SCALAR recrc 0");
+ T_rsc( recrc, 0 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR recout 2 10");
+ T_eq_int( recout[2], 10 );
+ T_log(T_NORMAL,"@@@ 4 SCALAR pending 2 0");
+ pending[2] = GetPending( ctx );
+ T_eq_int( pending[2], 0 );
+
+ T_log(T_NORMAL,"@@@ 4 SIGNAL 0");
+ Wakeup( semaphore[0] );
+
+ T_log(T_NORMAL,"@@@ 4 STATE 2 Zombie");
+ /* Code to check that Task 2 has terminated */
+}
+
+// ===============================================
+
+
+
+static void Runner( RtemsModelEventsMgr_Context *ctx )
+{
+ T_log( T_NORMAL, "Runner running" );
+ TestSegment4( ctx );
+ T_log( T_NORMAL, "Runner finished" );
+}
+
+static void Worker8( rtems_task_argument arg )
+{
+ Context *ctx;
+ rtems_event_set events;
+
+ ctx = (Context *) arg;
+
+ T_log( T_NORMAL, "Worker Running" );
+ TestSegment3( ctx );
+ T_log( T_NORMAL, "Worker finished" );
+
+ // (void) rtems_task_suspend( RTEMS_SELF );
+ // Ensure we hold no semaphores
+ Wakeup( ctx->worker_wakeup );
+ Wakeup( ctx->runner_wakeup );
+ // Wait for events so we don't terminate
+ rtems_event_receive( RTEMS_ALL_EVENTS, RTEMS_DEFAULT_OPTIONS, 0, &events );
+
+}
+
+RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage8[
+ RTEMS_TASK_STORAGE_SIZE(
+ MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE,
+ WORKER_ATTRIBUTES
+ )
+];
+
+static const rtems_task_config WorkerConfig8 = {
+ .name = rtems_build_name( 'W', 'O', 'R', 'K' ),
+ .initial_priority = PRIO_LOW,
+ .storage_area = WorkerStorage8,
+ .storage_size = sizeof( WorkerStorage8 ),
+ .maximum_thread_local_storage_size = MAX_TLS_SIZE,
+ .initial_modes = RTEMS_DEFAULT_MODES,
+ .attributes = WORKER_ATTRIBUTES
+};
+
+
+static void RtemsModelEventsMgr_Setup8(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Setup" );
+
+ memset( ctx, 0, sizeof( *ctx ) );
+ ctx->runner_thread = _Thread_Get_executing();
+ ctx->runner_id = ctx->runner_thread->Object.id;
+
+ T_log( T_NORMAL, "Creating Worker Wakeup Semaphore" );
+ ctx->worker_wakeup = CreateWakeupSema();
+ T_log( T_NORMAL, "Creating Runner Wakeup Semaphore" );
+ ctx->runner_wakeup = CreateWakeupSema();
+
+ sc = rtems_task_get_scheduler( RTEMS_SELF, &ctx->runner_sched );
+ T_rsc_success( sc );
+
+ #if defined(RTEMS_SMP)
+ sc = rtems_scheduler_ident_by_processor( 1, &ctx->other_sched );
+ T_rsc_success( sc );
+ T_ne_u32( ctx->runner_sched, ctx->other_sched );
+ #endif
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_HIGH );
+
+ sc = rtems_task_construct( &WorkerConfig8, &ctx->worker_id );
+ T_log( T_NORMAL, "Construct Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+
+ T_log( T_NORMAL, "Starting Worker..." );
+ sc = rtems_task_start( ctx->worker_id, Worker8, (rtems_task_argument) ctx );
+ T_log( T_NORMAL, "Started Worker, sc = %x", sc );
+ T_assert_rsc_success( sc );
+}
+
+
+static void RtemsModelEventsMgr_Setup_Wrap8( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Setup8( ctx );
+}
+
+
+static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance8;
+
+static T_fixture RtemsModelEventsMgr_Fixture8 = {
+ .setup = RtemsModelEventsMgr_Setup_Wrap8,
+ .stop = NULL,
+ .teardown = RtemsModelEventsMgr_Teardown_Wrap,
+ .scope = RtemsModelEventsMgr_Scope,
+ .initial_context = &RtemsModelEventsMgr_Instance8
+};
+
+static T_fixture_node RtemsModelEventsMgr_Node8;
+
+void RtemsModelEventsMgr_Run8(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+)
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ T_set_verbosity( T_NORMAL );
+
+ T_log( T_NORMAL, "Runner Invoked" );
+ T_log( T_NORMAL, "Runner Wait Class: %d", wait_class );
+ T_log( T_NORMAL, "Runner WaitForEvent: %d", waiting_for_event );
+
+ T_log( T_NORMAL, "Pushing Test Fixture..." );
+
+
+ ctx = T_push_fixture(
+ &RtemsModelEventsMgr_Node8,
+ &RtemsModelEventsMgr_Fixture8
+ );
+ // This runs RtemsModelEventsMgr_Fixture
+
+ T_log( T_NORMAL, "Test Fixture Pushed" );
+
+
+ ctx->send = send;
+ ctx->receive = receive;
+ ctx->get_pending_events = get_pending_events;
+ ctx->wait_class = wait_class;
+ ctx->waiting_for_event = waiting_for_event;
+
+ ctx->this_test_number = 8;
+
+ // RtemsModelEventsMgr_Prepare( ctx );
+ ctx->events_to_send = 0;
+ ctx->send_status = RTEMS_INCORRECT_STATE;
+ ctx->received_events = 0xffffffff;
+ ctx->receive_option_set = 0;
+ ctx->receive_timeout = RTEMS_NO_TIMEOUT;
+ ctx->unsatisfied_pending = 0xffffffff;
+ memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) );
+ T_eq_u32( GetPending( ctx ), 0 );
+ _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_STATE_READY );
+
+ TestSegment0( ctx );
+
+ Runner( ctx );
+
+ RtemsModelEventsMgr_Cleanup( ctx );
+
+ T_log( T_NORMAL, "Run Pop Fixture" );
+ ShowWorkerSemaId( ctx );
+ T_pop_fixture();
+ ShowWorkerSemaId( ctx );
+}
+
+/** @} */
diff --git a/testsuites/validation/tr-event-mgr-model.c b/testsuites/validation/tr-event-mgr-model.c
new file mode 100644
index 0000000000..59d0ef4d91
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model.c
@@ -0,0 +1,257 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestCaseRtemsModelEventsMgr
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Trinity College Dublin (http://www.tcd.ie)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file was automatically generated. Do not edit it manually.
+ * Please have a look at
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ *
+ * for information how to maintain and re-generate this file.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/threadimpl.h>
+
+#include "tr-event-mgr-model.h"
+
+static const char PromelaModelEventsMgr[] = "/PML-EventsMgr";
+
+#define INPUT_EVENTS ( RTEMS_EVENT_5 | RTEMS_EVENT_23 )
+
+rtems_id CreateWakeupSema( void )
+{
+ rtems_status_code sc;
+ rtems_id id;
+
+ sc = rtems_semaphore_create(
+ rtems_build_name( 'W', 'K', 'U', 'P' ),
+ 0,
+ RTEMS_SIMPLE_BINARY_SEMAPHORE,
+ 0,
+ &id
+ );
+ T_assert_rsc_success( sc );
+
+ return id;
+}
+
+void DeleteWakeupSema( rtems_id id )
+{
+ if ( id != 0 ) {
+ rtems_status_code sc;
+
+ sc = rtems_semaphore_delete( id );
+ T_rsc_success( sc );
+ }
+}
+
+void Wait( rtems_id id )
+{
+ rtems_status_code sc;
+
+ sc = rtems_semaphore_obtain( id, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
+ T_quiet_rsc_success( sc );
+}
+
+void Wakeup( rtems_id id )
+{
+ rtems_status_code sc;
+
+ sc = rtems_semaphore_release( id );
+ T_quiet_rsc_success( sc );
+}
+
+rtems_event_set GetPending( Context *ctx )
+{
+ rtems_event_set pending;
+ rtems_status_code sc;
+
+ sc = ( *ctx->receive )(
+ RTEMS_PENDING_EVENTS,
+ RTEMS_DEFAULT_OPTIONS,
+ 0,
+ &pending
+ );
+ T_quiet_rsc_success( sc );
+
+ return pending;
+}
+
+
+rtems_option mergeopts( bool wait, bool wantall )
+{
+ rtems_option opts;
+
+ if ( wait ) { opts = RTEMS_WAIT; }
+ else { opts = RTEMS_NO_WAIT; } ;
+ if ( wantall ) { opts |= RTEMS_EVENT_ALL; }
+ else { opts |= RTEMS_EVENT_ANY; } ;
+ return opts;
+}
+
+
+/*
+ * Here we need a mapping from model "task numbers/names" to thread Id's here
+ * Promela Process 3 corresponds to Task 0 (Worker), doing Send
+ * Promela Process 4 corresponds to Task 1 (Runner), doing Receive
+ */
+rtems_id mapid( Context *ctx, int pid )
+{
+ rtems_id mapped_id;
+
+ switch ( pid ) {
+ case 1 : mapped_id = ctx->worker_id ; break;
+ case 2 : mapped_id = ctx->runner_id; break;
+ default : mapped_id = 0xffffffff; break;
+ }
+ return mapped_id;
+}
+
+void checkTaskIs( rtems_id expected_id )
+{
+ rtems_id own_id;
+
+ own_id = _Thread_Get_executing()->Object.id;
+ T_eq_u32( own_id, expected_id );
+}
+
+void initialise_pending( rtems_event_set pending[], int max )
+{
+ int i;
+
+ for( i=0; i < max; i++ ) {
+ pending[i] = 0;
+ }
+}
+
+void initialise_semaphore( Context *ctx, rtems_id semaphore[] )
+{
+ semaphore[0] = ctx->worker_wakeup;
+ semaphore[1] = ctx->runner_wakeup;
+}
+
+void ShowWorkerSemaId( Context *ctx ) {
+ T_printf( "L:ctx->worker_wakeup = %d\n", ctx->worker_wakeup );
+}
+
+void ShowRunnerSemaId( Context *ctx ) {
+ T_printf( "L:ctx->runner_wakeup = %d\n", ctx->runner_wakeup );
+}
+
+static void RtemsModelEventsMgr_Teardown(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_task_priority prio;
+
+ T_log( T_NORMAL, "Runner Teardown" );
+
+ prio = 0;
+ sc = rtems_task_set_priority( RTEMS_SELF, PRIO_HIGH, &prio );
+ T_rsc_success( sc );
+ T_eq_u32( prio, PRIO_NORMAL );
+
+ if ( ctx->worker_id != 0 ) {
+ T_printf( "L:Deleting Task id : %d\n", ctx->worker_id );
+ sc = rtems_task_delete( ctx->worker_id );
+ T_rsc_success( sc );
+ }
+
+ T_log( T_NORMAL, "Deleting Worker Wakeup Semaphore" );
+ DeleteWakeupSema( ctx->worker_wakeup );
+ T_log( T_NORMAL, "Deleting Runner Wakeup Semaphore" );
+ DeleteWakeupSema( ctx->runner_wakeup );
+}
+
+void RtemsModelEventsMgr_Teardown_Wrap( void *arg )
+{
+ RtemsModelEventsMgr_Context *ctx;
+
+ ctx = arg;
+ RtemsModelEventsMgr_Teardown( ctx );
+}
+
+
+size_t RtemsModelEventsMgr_Scope( void *arg, char *buf, size_t n )
+{
+ RtemsModelEventsMgr_Context *ctx;
+ size_t m;
+ int p10;
+ int tnum ;
+ char digit;
+
+ ctx = arg;
+ p10 = POWER_OF_10;
+
+ m = T_str_copy(buf, PromelaModelEventsMgr, n);
+ buf += m;
+ tnum = ctx->this_test_number;
+ while( p10 > 0 && m < n )
+ {
+ digit = (char) ( (int) '0' + tnum / p10 );
+ buf[0] = digit;
+ ++buf;
+ ++m;
+ tnum = tnum % p10;
+ p10 /= 10;
+ }
+ return m;
+}
+
+void RtemsModelEventsMgr_Cleanup(
+ RtemsModelEventsMgr_Context *ctx
+)
+{
+ rtems_status_code sc;
+ rtems_event_set events;
+
+ events = 0;
+ sc = ( *ctx->receive )(
+ RTEMS_ALL_EVENTS,
+ RTEMS_NO_WAIT | RTEMS_EVENT_ANY,
+ 0,
+ &events
+ );
+ if ( sc == RTEMS_SUCCESSFUL ) {
+ T_quiet_ne_u32( events, 0 );
+ } else {
+ T_quiet_rsc( sc, RTEMS_UNSATISFIED );
+ T_quiet_eq_u32( events, 0 );
+ }
+}
diff --git a/testsuites/validation/tr-event-mgr-model.h b/testsuites/validation/tr-event-mgr-model.h
new file mode 100644
index 0000000000..64ee8644d2
--- /dev/null
+++ b/testsuites/validation/tr-event-mgr-model.h
@@ -0,0 +1,235 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Do not manually edit this file. It is part of the RTEMS quality process
+ * and was automatically generated.
+ *
+ * If you find something that needs to be fixed or worded better please
+ * post a report to an RTEMS mailing list or raise a bug report:
+ *
+ * https://docs.rtems.org/branches/master/user/support/bugs.html
+ *
+ * For information on updating and regenerating please refer to:
+ *
+ * https://docs.rtems.org/branches/master/eng/req/howto.html
+ */
+
+#ifndef _TR_MODEL_EVENTS_MGR_H
+#define _TR_MODEL_EVENTS_MGR_H
+
+#include <rtems.h>
+#include <rtems/score/thread.h>
+
+#include <rtems/test.h>
+#include "ts-config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * Run Setup/Cleanup structs/functions
+ */
+typedef struct {
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ); // copy of the
+ // corresponding RtemsModelEventsMgr_Run() parameter
+ rtems_status_code ( *receive )
+ ( rtems_event_set, rtems_option
+ , rtems_interval, rtems_event_set * ); // copy of the
+ // corresponding RtemsModelEventsMgr_Run() parameter
+ rtems_event_set ( *get_pending_events )( Thread_Control * ); // copy of the
+ // corresponding RtemsModelEventsMgr_Run() parameter
+ unsigned int wait_class; // copy of the corresponding
+ // RtemsModelEventsMgr_Run() parameter
+ int waiting_for_event; // copy of the corresponding
+ // RtemsModelEventsMgr_Run() parameter
+ int this_test_number; // test number used to identify a test runner instance
+ rtems_id receiver_id; // receiver ID used for the event send action.
+ rtems_event_set events_to_send; // events to send for the event send action
+ rtems_status_code send_status; // status of the event send action.
+ rtems_option receive_option_set; // option set used for the event receive action
+ rtems_interval receive_timeout; // timeout used for the event receive action
+ rtems_event_set received_events; // events received by the event receive action
+ rtems_status_code receive_status; // status of the event receive action
+ rtems_event_set unsatisfied_pending; // pending events after an event send action
+ // which did not satsify the event condition of the receiver
+ Thread_Control *runner_thread; // TCB of the runner task
+ rtems_id runner_id; // ID of the runner task
+ rtems_id worker_id; // task ID of the worker task
+ rtems_id worker_wakeup; // ID of the semaphore used to wake up the worker task
+ rtems_id runner_wakeup; // ID of the semaphore used to wake up the runner task
+ rtems_id runner_sched; // scheduler ID of scheduler used by the runner task
+ rtems_id other_sched; // scheduler ID of another scheduler
+ // which is not used by the runner task
+ T_thread_switch_log_4 thread_switch_log; // thread switch log
+} RtemsModelEventsMgr_Context;
+
+typedef enum {
+ PRIO_HIGH = 1,
+ PRIO_NORMAL,
+ PRIO_LOW,
+ PRIO_OTHER
+} Priorities;
+
+#define POWER_OF_10 100
+
+#define WORKER_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
+
+#define MAX_TLS_SIZE RTEMS_ALIGN_UP( 64, RTEMS_TASK_STORAGE_ALIGNMENT )
+
+typedef RtemsModelEventsMgr_Context Context;
+
+rtems_id CreateWakeupSema( void );
+
+void DeleteWakeupSema( rtems_id id );
+
+void Wait( rtems_id id );
+
+void Wakeup( rtems_id id ) ;
+
+rtems_event_set GetPending( Context *ctx );
+
+rtems_option mergeopts( bool wait, bool wantall );
+
+rtems_id mapid( Context *ctx, int pid ) ;
+
+void checkTaskIs( rtems_id expected_id ) ;
+
+void initialise_pending( rtems_event_set pending[], int max );
+
+void ShowWorkerSemaId( Context *ctx ) ;
+
+void ShowRunnerSemaId( Context *ctx ) ;
+
+void initialise_semaphore( Context *ctx, rtems_id semaphore[] );
+
+void RtemsModelEventsMgr_Setup_Wrap( void *arg ) ;
+
+
+void RtemsModelEventsMgr_Teardown_Wrap( void *arg ) ;
+
+size_t RtemsModelEventsMgr_Scope( void *arg, char *buf, size_t n ) ;
+
+void RtemsModelEventsMgr_Cleanup( RtemsModelEventsMgr_Context *ctx );
+
+/**
+ * @brief Runs the parameterized test case.
+ *
+ * @param send is the event send handler.
+ *
+ * @param receive is the event receive handler.
+ *
+ * @param get_pending_events is the get pending events handler.
+ *
+ * @param wait_class is the thread wait class.
+ *
+ * @param waiting_for_event is the thread waiting for event state.
+ */
+
+void RtemsModelEventsMgr_Run0(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+);
+
+void RtemsModelEventsMgr_Run1(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+);
+
+void RtemsModelEventsMgr_Run2(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+);
+
+void RtemsModelEventsMgr_Run3(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+);
+
+void RtemsModelEventsMgr_Run4(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+);
+
+void RtemsModelEventsMgr_Run5(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+);
+
+void RtemsModelEventsMgr_Run6(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+);
+
+void RtemsModelEventsMgr_Run7(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+);
+
+void RtemsModelEventsMgr_Run8(
+ rtems_status_code ( *send )( rtems_id, rtems_event_set ),
+ rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ),
+ rtems_event_set ( *get_pending_events )( Thread_Control * ),
+ unsigned int wait_class,
+ int waiting_for_event
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TR_EVENT_SEND_RECEIVE_H */
diff --git a/testsuites/validation/ts-model-0.c b/testsuites/validation/ts-model-0.c
new file mode 100644
index 0000000000..8e2c03f1a0
--- /dev/null
+++ b/testsuites/validation/ts-model-0.c
@@ -0,0 +1,78 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSTestSuiteTestsuitesModel0
+ */
+
+/*
+ * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
+ *
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
+ *
+ * https://docs.rtems.org
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/test.h>
+
+/**
+ * @defgroup RTEMSTestSuiteTestsuitesModel0 spec:/testsuites/model-0
+ *
+ * @ingroup RTEMSTestSuites
+ *
+ * @brief This general purpose test suite provides enough resources to run
+ * basic tests for all specified managers and functions. It is intended for
+ * model based testing.
+ *
+ * In SMP configurations, up to three scheduler instances using the SMP EDF
+ * scheduler are provided using up to four processors.
+ *
+ * @{
+ */
+
+const char rtems_test_name[] = "Model0";
+
+#define CONFIGURE_MAXIMUM_PROCESSORS 4
+
+#include "ts-default.h"
+
+/** @} */