From b9ebb0533f38e15f86a15c528653b7a0abb1932d Mon Sep 17 00:00:00 2001 From: Andrew Butterfield Date: Wed, 8 Dec 2021 17:13:53 +0100 Subject: validation: Add tests derived from models --- spec/build/testsuites/validation/grp.yml | 2 + spec/build/testsuites/validation/model-0.yml | 53 ++++ testsuites/validation/tc-event-mgr-model.c | 358 +++++++++++++++++++++++ testsuites/validation/tr-chains-api-model-0.c | 165 +++++++++++ testsuites/validation/tr-chains-api-model-1.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-10.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-11.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-12.c | 169 +++++++++++ testsuites/validation/tr-chains-api-model-13.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-14.c | 169 +++++++++++ testsuites/validation/tr-chains-api-model-15.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-16.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-17.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-18.c | 169 +++++++++++ testsuites/validation/tr-chains-api-model-19.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-2.c | 165 +++++++++++ testsuites/validation/tr-chains-api-model-20.c | 169 +++++++++++ testsuites/validation/tr-chains-api-model-3.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-4.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-5.c | 169 +++++++++++ testsuites/validation/tr-chains-api-model-6.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-7.c | 169 +++++++++++ testsuites/validation/tr-chains-api-model-8.c | 167 +++++++++++ testsuites/validation/tr-chains-api-model-9.c | 165 +++++++++++ testsuites/validation/tr-chains-api-model.c | 68 +++++ testsuites/validation/tr-chains-api-model.h | 55 ++++ testsuites/validation/tr-event-mgr-model-0.c | 344 ++++++++++++++++++++++ testsuites/validation/tr-event-mgr-model-1.c | 342 ++++++++++++++++++++++ testsuites/validation/tr-event-mgr-model-2.c | 355 ++++++++++++++++++++++ testsuites/validation/tr-event-mgr-model-3.c | 340 ++++++++++++++++++++++ testsuites/validation/tr-event-mgr-model-4.c | 361 +++++++++++++++++++++++ testsuites/validation/tr-event-mgr-model-5.c | 361 +++++++++++++++++++++++ testsuites/validation/tr-event-mgr-model-6.c | 383 ++++++++++++++++++++++++ testsuites/validation/tr-event-mgr-model-7.c | 388 +++++++++++++++++++++++++ testsuites/validation/tr-event-mgr-model-8.c | 375 ++++++++++++++++++++++++ testsuites/validation/tr-event-mgr-model.c | 257 ++++++++++++++++ testsuites/validation/tr-event-mgr-model.h | 235 +++++++++++++++ testsuites/validation/ts-model-0.c | 78 +++++ 38 files changed, 7868 insertions(+) create mode 100644 spec/build/testsuites/validation/model-0.yml create mode 100644 testsuites/validation/tc-event-mgr-model.c create mode 100644 testsuites/validation/tr-chains-api-model-0.c create mode 100644 testsuites/validation/tr-chains-api-model-1.c create mode 100644 testsuites/validation/tr-chains-api-model-10.c create mode 100644 testsuites/validation/tr-chains-api-model-11.c create mode 100644 testsuites/validation/tr-chains-api-model-12.c create mode 100644 testsuites/validation/tr-chains-api-model-13.c create mode 100644 testsuites/validation/tr-chains-api-model-14.c create mode 100644 testsuites/validation/tr-chains-api-model-15.c create mode 100644 testsuites/validation/tr-chains-api-model-16.c create mode 100644 testsuites/validation/tr-chains-api-model-17.c create mode 100644 testsuites/validation/tr-chains-api-model-18.c create mode 100644 testsuites/validation/tr-chains-api-model-19.c create mode 100644 testsuites/validation/tr-chains-api-model-2.c create mode 100644 testsuites/validation/tr-chains-api-model-20.c create mode 100644 testsuites/validation/tr-chains-api-model-3.c create mode 100644 testsuites/validation/tr-chains-api-model-4.c create mode 100644 testsuites/validation/tr-chains-api-model-5.c create mode 100644 testsuites/validation/tr-chains-api-model-6.c create mode 100644 testsuites/validation/tr-chains-api-model-7.c create mode 100644 testsuites/validation/tr-chains-api-model-8.c create mode 100644 testsuites/validation/tr-chains-api-model-9.c create mode 100644 testsuites/validation/tr-chains-api-model.c create mode 100644 testsuites/validation/tr-chains-api-model.h create mode 100644 testsuites/validation/tr-event-mgr-model-0.c create mode 100644 testsuites/validation/tr-event-mgr-model-1.c create mode 100644 testsuites/validation/tr-event-mgr-model-2.c create mode 100644 testsuites/validation/tr-event-mgr-model-3.c create mode 100644 testsuites/validation/tr-event-mgr-model-4.c create mode 100644 testsuites/validation/tr-event-mgr-model-5.c create mode 100644 testsuites/validation/tr-event-mgr-model-6.c create mode 100644 testsuites/validation/tr-event-mgr-model-7.c create mode 100644 testsuites/validation/tr-event-mgr-model-8.c create mode 100644 testsuites/validation/tr-event-mgr-model.c create mode 100644 testsuites/validation/tr-event-mgr-model.h create mode 100644 testsuites/validation/ts-model-0.c diff --git a/spec/build/testsuites/validation/grp.yml b/spec/build/testsuites/validation/grp.yml index 726cf732dd..ec44e86c7a 100644 --- a/spec/build/testsuites/validation/grp.yml +++ b/spec/build/testsuites/validation/grp.yml @@ -34,6 +34,8 @@ links: uid: fatal-start-on-not-online-processor - 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 diff --git a/spec/build/testsuites/validation/model-0.yml b/spec/build/testsuites/validation/model-0.yml new file mode 100644 index 0000000000..e6976cc496 --- /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 & Co. KG +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..def21c612c --- /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 & Co. KG + * + * 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 +#include +#include +#include + +#include "tr-event-mgr-model.h" + +#include + +/** + * @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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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 +#include +#include +#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..0aef758ab2 --- /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 & Co. KG + * 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 + + +#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..d858005398 --- /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 & Co. KG + * 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 + + +#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..bb8e2dcc34 --- /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 & Co. KG + * 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 + + +#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..4cc9dc8447 --- /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 & Co. KG + * 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 + + +#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..c4401d698d --- /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 & Co. KG + * 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 + + +#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..51bcd98564 --- /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 & Co. KG + * 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 + + +#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..5d2fee7363 --- /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 & Co. KG + * 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 + + +#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..f38f01698b --- /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 & Co. KG + * 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 + + +#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..9c3b53c673 --- /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 & Co. KG + * 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 + + +#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..a3884ce1cd --- /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 & Co. KG + * 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 + +#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..7e05f6953c --- /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 & Co. KG + * + * 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 +#include + +#include +#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..cd143a47e7 --- /dev/null +++ b/testsuites/validation/ts-model-0.c @@ -0,0 +1,78 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup TestsuitesModel0 + */ + +/* + * Copyright (C) 2020 embedded brains GmbH & Co. KG + * + * 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 + +/** + * @defgroup TestsuitesModel0 spec:/testsuites/model-0 + * + * @ingroup RTEMSTestSuitesValidation + * + * @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[] = "TestsuitesModel0"; + +#define CONFIGURE_MAXIMUM_PROCESSORS 4 + +#include "ts-default.h" + +/** @} */ -- cgit v1.2.3