diff options
Diffstat (limited to 'testsuites/validation/tr-model-events-mgr-3.c')
-rw-r--r-- | testsuites/validation/tr-model-events-mgr-3.c | 379 |
1 files changed, 78 insertions, 301 deletions
diff --git a/testsuites/validation/tr-model-events-mgr-3.c b/testsuites/validation/tr-model-events-mgr-3.c index 379fb98aa0..090a5aaee2 100644 --- a/testsuites/validation/tr-model-events-mgr-3.c +++ b/testsuites/validation/tr-model-events-mgr-3.c @@ -3,7 +3,7 @@ /** * @file * - * @ingroup RTEMSTestCaseRtemsModelEventsMgr3 + * @ingroup RTEMSTestCaseRtemsModelEventsMgr */ /* @@ -47,192 +47,8 @@ #include <rtems/score/threadimpl.h> -#include "tr-model-events-mgr.h" - -#include <rtems/test.h> - -typedef enum { - PRIO_HIGH = 1, - PRIO_NORMAL, - PRIO_LOW, - PRIO_OTHER -} Priorities; - - -typedef struct { - rtems_status_code ( *send )( rtems_id, rtems_event_set ); // copy of the - // corresponding RtemsModelEventsMgr3_Run() parameter - rtems_status_code ( *receive ) - ( rtems_event_set, rtems_option - , rtems_interval, rtems_event_set * ); // copy of the - // corresponding RtemsModelEventsMgr3_Run() parameter - rtems_event_set ( *get_pending_events )( Thread_Control * ); // copy of the - // corresponding RtemsModelEventsMgr3_Run() parameter - unsigned int wait_class; // copy of the corresponding - // RtemsModelEventsMgr3_Run() parameter - int waiting_for_event; // copy of the corresponding - // RtemsModelEventsMgr3_Run() parameter - 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 -} RtemsModelEventsMgr3_Context; - -static RtemsModelEventsMgr3_Context - RtemsModelEventsMgr3_Instance; - -static const char PromelaModelEventsMgr[] = "/PML-EventsMgr3"; - -#define INPUT_EVENTS ( RTEMS_EVENT_5 | RTEMS_EVENT_23 ) - -#define WORKER_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES - -#define MAX_TLS_SIZE RTEMS_ALIGN_UP( 64, RTEMS_TASK_STORAGE_ALIGNMENT ) - -typedef RtemsModelEventsMgr3_Context Context; - -RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage[ - RTEMS_TASK_STORAGE_SIZE( - MAX_TLS_SIZE + RTEMS_MINIMUM_STACK_SIZE, - WORKER_ATTRIBUTES - ) -]; - -static const rtems_task_config WorkerConfig = { - .name = rtems_build_name( 'W', 'O', 'R', 'K' ), - .initial_priority = PRIO_LOW, - .storage_area = WorkerStorage, - .storage_size = sizeof( WorkerStorage ), - .maximum_thread_local_storage_size = MAX_TLS_SIZE, - .initial_modes = RTEMS_DEFAULT_MODES, - .attributes = WORKER_ATTRIBUTES -}; -static 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; -} - -static void DeleteWakeupSema( rtems_id id ) -{ - if ( id != 0 ) { - rtems_status_code sc; - - sc = rtems_semaphore_delete( id ); - T_rsc_success( sc ); - } -} - -static void Wait( rtems_id id ) -{ - rtems_status_code sc; - - sc = rtems_semaphore_obtain( id, RTEMS_WAIT, RTEMS_NO_TIMEOUT ); - T_quiet_rsc_success( sc ); -} - -static void Wakeup( rtems_id id ) -{ - rtems_status_code sc; - - sc = rtems_semaphore_release( id ); - T_quiet_rsc_success( sc ); -} - -static rtems_event_set GetPendingEvents( 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; -} - - -static 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 - */ -static rtems_id mapid( Context *ctx, int pid ) -{ - rtems_id mapped_id; - - switch ( pid ) { - case 0 : mapped_id = ctx->worker_id ; break; - case 1 : mapped_id = ctx->runner_id; break; - default : mapped_id = 0xffffffff; break; - } - return mapped_id; -} - -static void checkTaskIs( rtems_id expected_id ) -{ - rtems_id own_id; - - own_id = _Thread_Get_executing()->Object.id; - T_eq_u32( own_id, expected_id ); -} - -static void initialise_pending( rtems_event_set pending[], int max ) -{ - int i; - - for( i=0; i < max; i++ ) { - pending[i] = 0; - } -} - -static void initialise_semaphore( Context *ctx, rtems_id semaphore[] ) -{ - semaphore[0] = ctx->worker_wakeup; - semaphore[1] = ctx->runner_wakeup; -} +#include "tr-model-events-mgr.h" /* =============================================== */ @@ -284,11 +100,11 @@ static rtems_id semaphore[SEMA_MAX]; 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 =====*/ @@ -298,17 +114,17 @@ static void TestSegment3( Context* ctx ) { checkTaskIs( ctx->worker_id ); T_log(T_NORMAL,"@@@ 3 WAIT 0"); Wait( semaphore[0] ); - - T_log(T_NORMAL,"@@@ 3 CALL event_send 0 1 15 sendrc"); - T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 1), 15 ); - sendrc = ( *ctx->send )( mapid( ctx, 1 ), 15 ); + + T_log(T_NORMAL,"@@@ 3 CALL event_send 0 1 11 sendrc"); + T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 1), 11 ); + sendrc = ( *ctx->send )( mapid( ctx, 1 ), 11 ); T_log( T_NORMAL, "Returned 0x%x from Send", sendrc ); - + T_log(T_NORMAL,"@@@ 3 SCALAR sendrc 0"); - T_rsc_success( sendrc ); + T_rsc( sendrc, 0 ); T_log(T_NORMAL,"@@@ 3 SIGNAL 1"); Wakeup( semaphore[1] ); - + T_log(T_NORMAL,"@@@ 3 STATE 0 Zombie"); /* Code to check that Task 0 has terminated */ } @@ -320,30 +136,30 @@ static void TestSegment4( Context* ctx ) { 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 1 15"); - pending[1] = GetPendingEvents( ctx ); - T_eq_int( pending[1], 15 ); - - T_log(T_NORMAL,"@@@ 4 CALL event_receive 6 1 1 0 recout recrc"); - T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 6, mergeopts( 1, 1 ) ,0 ,&recout ); - recrc = ( *ctx->receive )( 6, mergeopts( 1, 1 ), 0, &recout ); + + T_log(T_NORMAL,"@@@ 4 SCALAR pending 1 11"); + pending[1] = GetPending( ctx ); + T_eq_int( pending[1], 11 ); + + T_log(T_NORMAL,"@@@ 4 CALL event_receive 10 1 1 0 recout recrc"); + T_log( T_NORMAL, "Calling Receive(%d,%d,%d,%d)", 10, mergeopts( 1, 1 ) ,0 ,&recout ); + recrc = ( *ctx->receive )( 10, mergeopts( 1, 1 ), 0, &recout ); T_log( T_NORMAL, "Returned 0x%x from Receive", recrc ); - + T_log(T_NORMAL,"@@@ 4 SCALAR recrc 0"); - T_rsc_success( recrc ); - T_log(T_NORMAL,"@@@ 4 SCALAR recout 6"); - T_eq_int( recout, 6 ); - T_log(T_NORMAL,"@@@ 4 SCALAR pending 1 9"); - pending[1] = GetPendingEvents( ctx ); - T_eq_int( pending[1], 9 ); - + T_rsc( recrc, 0 ); + T_log(T_NORMAL,"@@@ 4 SCALAR recout 10"); + T_eq_int( recout, 10 ); + T_log(T_NORMAL,"@@@ 4 SCALAR pending 1 1"); + pending[1] = GetPending( ctx ); + T_eq_int( pending[1], 1 ); + T_log(T_NORMAL,"@@@ 4 SIGNAL 0"); Wakeup( semaphore[0] ); - + T_log(T_NORMAL,"@@@ 4 STATE 1 Zombie"); /* Code to check that Task 1 has terminated */ } @@ -351,7 +167,15 @@ static void TestSegment4( Context* ctx ) { /* =============================================== */ -static void Worker( rtems_task_argument arg ) + +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; @@ -365,17 +189,26 @@ static void Worker( rtems_task_argument arg ) } +RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage3[ + RTEMS_TASK_STORAGE_SIZE( + MAX_TLS_SIZE + RTEMS_MINIMUM_STACK_SIZE, + WORKER_ATTRIBUTES + ) +]; -static void Runner( RtemsModelEventsMgr3_Context *ctx ) -{ - T_log( T_NORMAL, "Runner running" ); - TestSegment4( ctx ); - T_log( T_NORMAL, "Runner finished" ); -} +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 RtemsModelEventsMgr3_Setup( - RtemsModelEventsMgr3_Context *ctx +static void RtemsModelEventsMgr_Setup3( + RtemsModelEventsMgr_Context *ctx ) { rtems_status_code sc; @@ -403,99 +236,39 @@ static void RtemsModelEventsMgr3_Setup( T_rsc_success( sc ); T_eq_u32( prio, PRIO_HIGH ); - sc = rtems_task_construct( &WorkerConfig, &ctx->worker_id ); + 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, Worker, (rtems_task_argument) ctx ); + 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 RtemsModelEventsMgr3_Setup_Wrap( void *arg ) -{ - RtemsModelEventsMgr3_Context *ctx; - - ctx = arg; - RtemsModelEventsMgr3_Setup( ctx ); -} - -static void RtemsModelEventsMgr3_Teardown( - RtemsModelEventsMgr3_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 ) { - sc = rtems_task_delete( ctx->worker_id ); - T_rsc_success( sc ); - } - DeleteWakeupSema( ctx->worker_wakeup ); - DeleteWakeupSema( ctx->runner_wakeup ); -} - -static void RtemsModelEventsMgr3_Teardown_Wrap( void *arg ) +static void RtemsModelEventsMgr_Setup_Wrap3( void *arg ) { - RtemsModelEventsMgr3_Context *ctx; + RtemsModelEventsMgr_Context *ctx; ctx = arg; - RtemsModelEventsMgr3_Teardown( ctx ); + RtemsModelEventsMgr_Setup3( ctx ); } -static size_t RtemsModelEventsMgr3_Scope( void *arg, char *buf, size_t n ) -{ - size_t pme_size; - pme_size = strlen(PromelaModelEventsMgr); - return T_str_copy(buf, PromelaModelEventsMgr, pme_size); -} +static RtemsModelEventsMgr_Context RtemsModelEventsMgr_Instance3; -static T_fixture RtemsModelEventsMgr3_Fixture = { - .setup = RtemsModelEventsMgr3_Setup_Wrap, +static T_fixture RtemsModelEventsMgr_Fixture3 = { + .setup = RtemsModelEventsMgr_Setup_Wrap3, .stop = NULL, - .teardown = RtemsModelEventsMgr3_Teardown_Wrap, - .scope = RtemsModelEventsMgr3_Scope, - .initial_context = &RtemsModelEventsMgr3_Instance + .teardown = RtemsModelEventsMgr_Teardown_Wrap, + .scope = RtemsModelEventsMgr_Scope, + .initial_context = &RtemsModelEventsMgr_Instance3 }; +static T_fixture_node RtemsModelEventsMgr_Node3; - -static void RtemsModelEventsMgr3_Cleanup( - RtemsModelEventsMgr3_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 ); - } -} - - -static T_fixture_node RtemsModelEventsMgr3_Node; - -void RtemsModelEventsMgr3_Run( +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 * ), @@ -503,7 +276,7 @@ void RtemsModelEventsMgr3_Run( int waiting_for_event ) { - RtemsModelEventsMgr3_Context *ctx; + RtemsModelEventsMgr_Context *ctx; T_set_verbosity( T_NORMAL ); @@ -513,20 +286,24 @@ void RtemsModelEventsMgr3_Run( T_log( T_NORMAL, "Pushing Test Fixture..." ); + ctx = T_push_fixture( - &RtemsModelEventsMgr3_Node, - &RtemsModelEventsMgr3_Fixture + &RtemsModelEventsMgr_Node3, + &RtemsModelEventsMgr_Fixture3 ); 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; - // RtemsModelEventsMgr3_Prepare( ctx ); + ctx->this_test_number = 3; + + // RtemsModelEventsMgr_Prepare( ctx ); ctx->events_to_send = 0; ctx->send_status = RTEMS_INCORRECT_STATE; ctx->received_events = 0xffffffff; @@ -534,14 +311,14 @@ void RtemsModelEventsMgr3_Run( ctx->receive_timeout = RTEMS_NO_TIMEOUT; ctx->unsatisfied_pending = 0xffffffff; memset( &ctx->thread_switch_log, 0, sizeof( ctx->thread_switch_log ) ); - T_eq_u32( GetPendingEvents( ctx ), 0 ); + T_eq_u32( GetPending( ctx ), 0 ); _Thread_Wait_flags_set( ctx->runner_thread, THREAD_WAIT_FLAGS_INITIAL ); TestSegment0( ctx ); Runner( ctx ); - RtemsModelEventsMgr3_Cleanup( ctx ); + RtemsModelEventsMgr_Cleanup( ctx ); T_log( T_NORMAL, "Run Pop Fixture" ); T_pop_fixture(); |