diff options
Diffstat (limited to 'testsuites/validation/tr-model-events-mgr-0.c')
-rw-r--r-- | testsuites/validation/tr-model-events-mgr-0.c | 368 |
1 files changed, 64 insertions, 304 deletions
diff --git a/testsuites/validation/tr-model-events-mgr-0.c b/testsuites/validation/tr-model-events-mgr-0.c index 960b11d521..726a76f8de 100644 --- a/testsuites/validation/tr-model-events-mgr-0.c +++ b/testsuites/validation/tr-model-events-mgr-0.c @@ -3,7 +3,7 @@ /** * @file * - * @ingroup RTEMSTestCaseRtemsModelEventsMgr0 + * @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 RtemsModelEventsMgr0_Run() parameter - rtems_status_code ( *receive ) - ( rtems_event_set, rtems_option - , rtems_interval, rtems_event_set * ); // copy of the - // corresponding RtemsModelEventsMgr0_Run() parameter - rtems_event_set ( *get_pending_events )( Thread_Control * ); // copy of the - // corresponding RtemsModelEventsMgr0_Run() parameter - unsigned int wait_class; // copy of the corresponding - // RtemsModelEventsMgr0_Run() parameter - int waiting_for_event; // copy of the corresponding - // RtemsModelEventsMgr0_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 -} RtemsModelEventsMgr0_Context; - -static RtemsModelEventsMgr0_Context - RtemsModelEventsMgr0_Instance; - -static const char PromelaModelEventsMgr[] = "/PML-EventsMgr0"; - -#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 RtemsModelEventsMgr0_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 14 sendrc"); - T_log( T_NORMAL, "Calling Send(%d,%d)", mapid( ctx, 1), 14 ); - sendrc = ( *ctx->send )( mapid( ctx, 1 ), 14 ); + + T_log(T_NORMAL,"@@@ 3 CALL event_send 0 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 SCALAR sendrc 0"); - T_rsc_success( sendrc ); + + 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 0 Zombie"); /* Code to check that Task 0 has terminated */ } @@ -320,30 +136,13 @@ 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 14"); - pending[1] = GetPendingEvents( ctx ); - T_eq_int( pending[1], 14 ); - - 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 10"); - T_eq_int( recout, 10 ); - T_log(T_NORMAL,"@@@ 4 SCALAR pending 1 4"); - pending[1] = GetPendingEvents( ctx ); - T_eq_int( pending[1], 4 ); - + 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 +150,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 Worker0( rtems_task_argument arg ) { Context *ctx; @@ -365,17 +172,26 @@ static void Worker( rtems_task_argument arg ) } +RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char WorkerStorage0[ + RTEMS_TASK_STORAGE_SIZE( + MAX_TLS_SIZE + RTEMS_MINIMUM_STACK_SIZE, + WORKER_ATTRIBUTES + ) +]; -static void Runner( RtemsModelEventsMgr0_Context *ctx ) -{ - T_log( T_NORMAL, "Runner running" ); - TestSegment4( ctx ); - T_log( T_NORMAL, "Runner finished" ); -} +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 RtemsModelEventsMgr0_Setup( - RtemsModelEventsMgr0_Context *ctx +static void RtemsModelEventsMgr_Setup0( + RtemsModelEventsMgr_Context *ctx ) { rtems_status_code sc; @@ -403,99 +219,39 @@ static void RtemsModelEventsMgr0_Setup( T_rsc_success( sc ); T_eq_u32( prio, PRIO_HIGH ); - sc = rtems_task_construct( &WorkerConfig, &ctx->worker_id ); + 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, Worker, (rtems_task_argument) ctx ); + 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 RtemsModelEventsMgr0_Setup_Wrap( void *arg ) -{ - RtemsModelEventsMgr0_Context *ctx; - - ctx = arg; - RtemsModelEventsMgr0_Setup( ctx ); -} - -static void RtemsModelEventsMgr0_Teardown( - RtemsModelEventsMgr0_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 RtemsModelEventsMgr0_Teardown_Wrap( void *arg ) +static void RtemsModelEventsMgr_Setup_Wrap0( void *arg ) { - RtemsModelEventsMgr0_Context *ctx; + RtemsModelEventsMgr_Context *ctx; ctx = arg; - RtemsModelEventsMgr0_Teardown( ctx ); + RtemsModelEventsMgr_Setup0( ctx ); } -static size_t RtemsModelEventsMgr0_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_Instance0; -static T_fixture RtemsModelEventsMgr0_Fixture = { - .setup = RtemsModelEventsMgr0_Setup_Wrap, +static T_fixture RtemsModelEventsMgr_Fixture0 = { + .setup = RtemsModelEventsMgr_Setup_Wrap0, .stop = NULL, - .teardown = RtemsModelEventsMgr0_Teardown_Wrap, - .scope = RtemsModelEventsMgr0_Scope, - .initial_context = &RtemsModelEventsMgr0_Instance + .teardown = RtemsModelEventsMgr_Teardown_Wrap, + .scope = RtemsModelEventsMgr_Scope, + .initial_context = &RtemsModelEventsMgr_Instance0 }; +static T_fixture_node RtemsModelEventsMgr_Node0; - -static void RtemsModelEventsMgr0_Cleanup( - RtemsModelEventsMgr0_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 RtemsModelEventsMgr0_Node; - -void RtemsModelEventsMgr0_Run( +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 * ), @@ -503,7 +259,7 @@ void RtemsModelEventsMgr0_Run( int waiting_for_event ) { - RtemsModelEventsMgr0_Context *ctx; + RtemsModelEventsMgr_Context *ctx; T_set_verbosity( T_NORMAL ); @@ -513,20 +269,24 @@ void RtemsModelEventsMgr0_Run( T_log( T_NORMAL, "Pushing Test Fixture..." ); + ctx = T_push_fixture( - &RtemsModelEventsMgr0_Node, - &RtemsModelEventsMgr0_Fixture + &RtemsModelEventsMgr_Node0, + &RtemsModelEventsMgr_Fixture0 ); 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; - // RtemsModelEventsMgr0_Prepare( ctx ); + ctx->this_test_number = 0; + + // RtemsModelEventsMgr_Prepare( ctx ); ctx->events_to_send = 0; ctx->send_status = RTEMS_INCORRECT_STATE; ctx->received_events = 0xffffffff; @@ -534,14 +294,14 @@ void RtemsModelEventsMgr0_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 ); - RtemsModelEventsMgr0_Cleanup( ctx ); + RtemsModelEventsMgr_Cleanup( ctx ); T_log( T_NORMAL, "Run Pop Fixture" ); T_pop_fixture(); |