From ddef7ddaad297eeead2a5a7ad3cd5c2baef27e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frank=20K=C3=BChndel?= Date: Fri, 14 May 2021 11:07:00 +0200 Subject: validation: Code for timer server-fire-when test Adding tc-timer-server-fire-when.c to validation-2.yml --- spec/build/testsuites/validation/validation-2.yml | 1 + testsuites/validation/tc-timer-server-fire-when.c | 1415 +++++++++++++++++++++ 2 files changed, 1416 insertions(+) create mode 100644 testsuites/validation/tc-timer-server-fire-when.c diff --git a/spec/build/testsuites/validation/validation-2.yml b/spec/build/testsuites/validation/validation-2.yml index 58f739077d..85fb480863 100644 --- a/spec/build/testsuites/validation/validation-2.yml +++ b/spec/build/testsuites/validation/validation-2.yml @@ -17,6 +17,7 @@ source: - testsuites/validation/tc-timer-initiate-server.c - testsuites/validation/tc-timer-reset.c - testsuites/validation/tc-timer-server-fire-after.c +- testsuites/validation/tc-timer-server-fire-when.c - testsuites/validation/ts-validation-2.c stlib: [] target: testsuites/validation/ts-validation-2.exe diff --git a/testsuites/validation/tc-timer-server-fire-when.c b/testsuites/validation/tc-timer-server-fire-when.c new file mode 100644 index 0000000000..4772c11f57 --- /dev/null +++ b/testsuites/validation/tc-timer-server-fire-when.c @@ -0,0 +1,1415 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSTestCaseRtemsTimerReqServerFireWhen + */ + +/* + * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "tx-support.h" + +#include + +/** + * @defgroup RTEMSTestCaseRtemsTimerReqServerFireWhen \ + * spec:/rtems/timer/req/server-fire-when + * + * @ingroup RTEMSTestSuiteTestsuitesValidation2 + * + * @{ + */ + +typedef enum { + RtemsTimerReqServerFireWhen_Pre_Server_Init, + RtemsTimerReqServerFireWhen_Pre_Server_NotInit, + RtemsTimerReqServerFireWhen_Pre_Server_NA +} RtemsTimerReqServerFireWhen_Pre_Server; + +typedef enum { + RtemsTimerReqServerFireWhen_Pre_RtClock_Set, + RtemsTimerReqServerFireWhen_Pre_RtClock_Unset, + RtemsTimerReqServerFireWhen_Pre_RtClock_NA +} RtemsTimerReqServerFireWhen_Pre_RtClock; + +typedef enum { + RtemsTimerReqServerFireWhen_Pre_Routine_Valid, + RtemsTimerReqServerFireWhen_Pre_Routine_Null, + RtemsTimerReqServerFireWhen_Pre_Routine_NA +} RtemsTimerReqServerFireWhen_Pre_Routine; + +typedef enum { + RtemsTimerReqServerFireWhen_Pre_WallTime_Valid, + RtemsTimerReqServerFireWhen_Pre_WallTime_Invalid, + RtemsTimerReqServerFireWhen_Pre_WallTime_Past, + RtemsTimerReqServerFireWhen_Pre_WallTime_Null, + RtemsTimerReqServerFireWhen_Pre_WallTime_NA +} RtemsTimerReqServerFireWhen_Pre_WallTime; + +typedef enum { + RtemsTimerReqServerFireWhen_Pre_Id_Valid, + RtemsTimerReqServerFireWhen_Pre_Id_Invalid, + RtemsTimerReqServerFireWhen_Pre_Id_NA +} RtemsTimerReqServerFireWhen_Pre_Id; + +typedef enum { + RtemsTimerReqServerFireWhen_Pre_Context_None, + RtemsTimerReqServerFireWhen_Pre_Context_Interrupt, + RtemsTimerReqServerFireWhen_Pre_Context_Server, + RtemsTimerReqServerFireWhen_Pre_Context_NA +} RtemsTimerReqServerFireWhen_Pre_Context; + +typedef enum { + RtemsTimerReqServerFireWhen_Pre_Clock_None, + RtemsTimerReqServerFireWhen_Pre_Clock_Ticks, + RtemsTimerReqServerFireWhen_Pre_Clock_Realtime, + RtemsTimerReqServerFireWhen_Pre_Clock_NA +} RtemsTimerReqServerFireWhen_Pre_Clock; + +typedef enum { + RtemsTimerReqServerFireWhen_Pre_State_Inactive, + RtemsTimerReqServerFireWhen_Pre_State_Scheduled, + RtemsTimerReqServerFireWhen_Pre_State_Pending, + RtemsTimerReqServerFireWhen_Pre_State_NA +} RtemsTimerReqServerFireWhen_Pre_State; + +typedef enum { + RtemsTimerReqServerFireWhen_Post_Status_Ok, + RtemsTimerReqServerFireWhen_Post_Status_NotDef, + RtemsTimerReqServerFireWhen_Post_Status_InvId, + RtemsTimerReqServerFireWhen_Post_Status_InvAddr, + RtemsTimerReqServerFireWhen_Post_Status_InvClock, + RtemsTimerReqServerFireWhen_Post_Status_IncStat, + RtemsTimerReqServerFireWhen_Post_Status_NA +} RtemsTimerReqServerFireWhen_Post_Status; + +typedef enum { + RtemsTimerReqServerFireWhen_Post_Context_None, + RtemsTimerReqServerFireWhen_Post_Context_Interrupt, + RtemsTimerReqServerFireWhen_Post_Context_Server, + RtemsTimerReqServerFireWhen_Post_Context_Nop, + RtemsTimerReqServerFireWhen_Post_Context_NA +} RtemsTimerReqServerFireWhen_Post_Context; + +typedef enum { + RtemsTimerReqServerFireWhen_Post_Clock_None, + RtemsTimerReqServerFireWhen_Post_Clock_Ticks, + RtemsTimerReqServerFireWhen_Post_Clock_Realtime, + RtemsTimerReqServerFireWhen_Post_Clock_Nop, + RtemsTimerReqServerFireWhen_Post_Clock_NA +} RtemsTimerReqServerFireWhen_Post_Clock; + +typedef enum { + RtemsTimerReqServerFireWhen_Post_State_Scheduled, + RtemsTimerReqServerFireWhen_Post_State_Nop, + RtemsTimerReqServerFireWhen_Post_State_NA +} RtemsTimerReqServerFireWhen_Post_State; + +typedef enum { + RtemsTimerReqServerFireWhen_Post_WallTime_Param, + RtemsTimerReqServerFireWhen_Post_WallTime_Nop, + RtemsTimerReqServerFireWhen_Post_WallTime_NA +} RtemsTimerReqServerFireWhen_Post_WallTime; + +typedef enum { + RtemsTimerReqServerFireWhen_Post_Routine_Param, + RtemsTimerReqServerFireWhen_Post_Routine_Nop, + RtemsTimerReqServerFireWhen_Post_Routine_NA +} RtemsTimerReqServerFireWhen_Post_Routine; + +typedef enum { + RtemsTimerReqServerFireWhen_Post_UserData_Param, + RtemsTimerReqServerFireWhen_Post_UserData_Nop, + RtemsTimerReqServerFireWhen_Post_UserData_NA +} RtemsTimerReqServerFireWhen_Post_UserData; + +typedef enum { + PRE_NONE = 0, + PRE_INTERRUPT = 1, + PRE_SERVER = 2 +} PreConditionContext; + +typedef enum { + SCHEDULE_NONE = 0, + SCHEDULE_SOON = 1, + SCHEDULE_MAX = 5 +} Scheduling_Ticks; + +/** + * @brief Test context for spec:/rtems/timer/req/server-fire-when test case. + */ +typedef struct { + /** + * @brief This member contains a valid id of a timer. + */ + rtems_id timer_id; + + /** + * @brief This member specifies the ``id`` parameter for the action. + */ + rtems_id id_param; + + /** + * @brief This member specifies the ``wall_time`` parameter for the action. + */ + const rtems_time_of_day *wall_time_param; + + /** + * @brief This member specifies the ``routine`` parameter for the action. + */ + rtems_timer_service_routine_entry routine_param; + + /** + * @brief This member contains the returned status code of the action. + */ + rtems_status_code status; + + /** + * @brief This member contains a counter of invocations of the Timer Service + * Routine. + */ + int invocations; + + /** + * @brief Function TriggerTimer() is used to figure out when the Timer + * Service Routine gets executed. This member contains the time-of-day when + * the Timer Service Routine fires (see fire). + */ + rtems_time_of_day tod_till_fire; + + /** + * @brief This member contains the user data given to the Timer Service + * Routine when called. + */ + void *routine_user_data; + + /** + * @brief This member specifies which pre-condition context (none, interrupt + * context, server context) must be created before the + * rtems_timer_server_fire_when() action gets executed. + */ + PreConditionContext pre_cond_contex; + + /** + * @brief This member specifies the pre-condition state of the realtime + * clock. It should either be set to the value referenced by pre_cond_tod + * or if NULL, then the realtime clock should be not set. + */ + const rtems_time_of_day *pre_cond_tod; + + /** + * @brief This member stores internal clock and context settings of the timer + * before the execution of the test action. + */ + Timer_Classes pre_class; + + /** + * @brief This member stores the state of the timer before the execution of + * the test action. + */ + Timer_States pre_state; + + /** + * @brief This member stores the state of the timer after the execution of + * the test action. + */ + Timer_States post_state; + + /** + * @brief This member stores the scheduling data of the timer before the + * execution of the test action. + */ + Timer_Scheduling_Data pre_scheduling_data; + + /** + * @brief This member stores the scheduling data of the timer after the + * execution of the test action. + */ + Timer_Scheduling_Data post_scheduling_data; + + /** + * @brief This member defines the pre-condition states for the next action. + */ + size_t pcs[ 8 ]; + + /** + * @brief This member indicates if the test action loop is currently + * executed. + */ + bool in_action_loop; +} RtemsTimerReqServerFireWhen_Context; + +static RtemsTimerReqServerFireWhen_Context + RtemsTimerReqServerFireWhen_Instance; + +static const char * const RtemsTimerReqServerFireWhen_PreDesc_Server[] = { + "Init", + "NotInit", + "NA" +}; + +static const char * const RtemsTimerReqServerFireWhen_PreDesc_RtClock[] = { + "Set", + "Unset", + "NA" +}; + +static const char * const RtemsTimerReqServerFireWhen_PreDesc_Routine[] = { + "Valid", + "Null", + "NA" +}; + +static const char * const RtemsTimerReqServerFireWhen_PreDesc_WallTime[] = { + "Valid", + "Invalid", + "Past", + "Null", + "NA" +}; + +static const char * const RtemsTimerReqServerFireWhen_PreDesc_Id[] = { + "Valid", + "Invalid", + "NA" +}; + +static const char * const RtemsTimerReqServerFireWhen_PreDesc_Context[] = { + "None", + "Interrupt", + "Server", + "NA" +}; + +static const char * const RtemsTimerReqServerFireWhen_PreDesc_Clock[] = { + "None", + "Ticks", + "Realtime", + "NA" +}; + +static const char * const RtemsTimerReqServerFireWhen_PreDesc_State[] = { + "Inactive", + "Scheduled", + "Pending", + "NA" +}; + +static const char * const * const RtemsTimerReqServerFireWhen_PreDesc[] = { + RtemsTimerReqServerFireWhen_PreDesc_Server, + RtemsTimerReqServerFireWhen_PreDesc_RtClock, + RtemsTimerReqServerFireWhen_PreDesc_Routine, + RtemsTimerReqServerFireWhen_PreDesc_WallTime, + RtemsTimerReqServerFireWhen_PreDesc_Id, + RtemsTimerReqServerFireWhen_PreDesc_Context, + RtemsTimerReqServerFireWhen_PreDesc_Clock, + RtemsTimerReqServerFireWhen_PreDesc_State, + NULL +}; + +static const rtems_time_of_day tod_now = { 2000, 1, 1, 0, 0, 0, 0 }; +static const rtems_time_of_day tod_schedule = { 2000, 1, 1, 5, 0, 0, 0 }; +static const rtems_time_of_day tod_invalid = { 1985, 1, 1, 0, 0, 0, 0 }; +static const rtems_time_of_day tod_past = { 1999, 12, 31, 23, 59, 59, 1 }; + +static void TriggerTimer( + const RtemsTimerReqServerFireWhen_Context *ctx, + rtems_time_of_day *tod_fire +) +{ + rtems_time_of_day tod = tod_now; + int invocations_old = ctx->invocations; + int i; + + /* Fire the timer service routine for ticks and realtime clock */ + for ( i = 1; i <= SCHEDULE_MAX; ++i ) { + ClockTick(); + } + + for ( i = 1; i < 24; ++i ) { + tod.hour = i; + T_rsc_success( rtems_clock_set( &tod ) ); + if ( tod_fire != NULL && ctx->invocations > invocations_old ) { + *tod_fire = tod; + break; + } + } +} + +RTEMS_INLINE_ROUTINE void TimerServiceRoutine( + rtems_id timer_id, + void *user_data +) +{ + RtemsTimerReqServerFireWhen_Context *ctx = user_data; + ++( ctx->invocations ); + ctx->routine_user_data = user_data; +} + +static void RtemsTimerReqServerFireWhen_Pre_Server_Prepare( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Pre_Server state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Pre_Server_Init: { + /* + * While the Timer Server task has been successfully initialized by a + * call to rtems_timer_initiate_server(). + */ + rtems_status_code status; + status = rtems_timer_initiate_server( + RTEMS_TIMER_SERVER_DEFAULT_PRIORITY, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_ATTRIBUTES + ); + T_rsc_success( status ); + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Server_NotInit: { + /* + * While the Timer Server task has not been initialized and does not + * exist. + */ + DeleteTimerServer(); + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Server_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Pre_RtClock_Prepare( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Pre_RtClock state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Pre_RtClock_Set: { + /* + * While the realtime clock is set to a valid time-of-day. + */ + ctx->pre_cond_tod = &tod_now; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_RtClock_Unset: { + /* + * While the realtime clock has never been set. + */ + ctx->pre_cond_tod = NULL; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_RtClock_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Pre_Routine_Prepare( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Pre_Routine state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Pre_Routine_Valid: { + /* + * While the ``routine`` parameter references an object of type + * rtems_timer_service_routine_entry. + */ + ctx->routine_param = TimerServiceRoutine; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Routine_Null: { + /* + * While the ``routine`` parameter is NULL.. + */ + ctx->routine_param = NULL; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Routine_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Pre_WallTime_Prepare( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Pre_WallTime state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Pre_WallTime_Valid: { + /* + * While the ``wall_time`` parameter references a time at least one + * second in the future but not later than the last second of the year + * 2105. (Times after 2105 are invalid.) + */ + ctx->wall_time_param = &tod_schedule; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_WallTime_Invalid: { + /* + * While the ``wall_time`` parameter is invalid. + */ + ctx->wall_time_param = &tod_invalid; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_WallTime_Past: { + /* + * While the ``wall_time`` parameter references a time in the current + * second or in the past but not earlier than 1988. (Times before 1988 + * are invalid.) + */ + ctx->wall_time_param = &tod_past; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_WallTime_Null: { + /* + * While the ``wall_time`` parameter is 0. + */ + ctx->wall_time_param = NULL; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_WallTime_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Pre_Id_Prepare( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Pre_Id state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Pre_Id_Valid: { + /* + * While the ``id`` parameter is valid. + */ + ctx->id_param = ctx->timer_id; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Id_Invalid: { + /* + * While the ``id`` parameter is invalid. + */ + ctx->id_param = RTEMS_ID_NONE; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Id_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Pre_Context_Prepare( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Pre_Context state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Pre_Context_None: { + /* + * While the Timer Service Routine has never been scheduled since + * creation of the timer. See also none. + */ + ctx->pre_cond_contex = PRE_NONE; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Context_Interrupt: { + /* + * While the timer is in interrupt context. + */ + ctx->pre_cond_contex = PRE_INTERRUPT; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Context_Server: { + /* + * While the timer is in server context. + */ + ctx->pre_cond_contex = PRE_SERVER; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Context_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Pre_Clock_Prepare( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Pre_Clock state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Pre_Clock_None: { + /* + * While the timer has never been scheduled since creation of the timer. + */ + T_eq_int( ctx->pre_cond_contex, PRE_NONE ); + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Clock_Ticks: { + /* + * While the clock used to determine when the timer will fire is the + * ticks based clock. + */ + rtems_status_code status; + + if ( ctx->pre_cond_contex == PRE_INTERRUPT ) { + status = rtems_timer_fire_after( + ctx->timer_id, + SCHEDULE_SOON, + TimerServiceRoutine, + ctx + ); + } else { + status = rtems_timer_server_fire_after( + ctx->timer_id, + SCHEDULE_SOON, + TimerServiceRoutine, + ctx + ); + } + T_rsc_success( status ); + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Clock_Realtime: { + /* + * While the clock used to determine when the timer will fire is the + * realtime clock. + */ + rtems_status_code status; + T_rsc_success( rtems_clock_set( &tod_now ) ); + + if ( ctx->pre_cond_contex == PRE_INTERRUPT ) { + status = rtems_timer_fire_when( + ctx->timer_id, + &tod_schedule, + TimerServiceRoutine, + ctx + ); + } else { + status = rtems_timer_server_fire_when( + ctx->timer_id, + &tod_schedule, + TimerServiceRoutine, + ctx + ); + } + T_rsc_success( status ); + break; + } + + case RtemsTimerReqServerFireWhen_Pre_Clock_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Pre_State_Prepare( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Pre_State state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Pre_State_Inactive: { + /* + * While the timer is in inactive state. + */ + TriggerTimer( ctx, NULL ); + T_eq_int( + ctx->invocations, + ( ctx->pre_cond_contex == PRE_NONE ) ? 0 : 1 + ); + ctx->invocations = 0; + ctx->pre_state = TIMER_INACTIVE; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_State_Scheduled: { + /* + * While the timer is in scheduled state. + */ + /* The timer was already scheduled in the "Clock" pre-conditions. */ + ctx->pre_state = TIMER_SCHEDULED; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_State_Pending: { + /* + * While the timer is in pending state. + */ + T_rsc_success( rtems_task_suspend( GetTimerServerTaskId() ) ); + TriggerTimer( ctx, NULL ); + T_eq_int( ctx->invocations, 0 ); + ctx->pre_state = TIMER_PENDING; + break; + } + + case RtemsTimerReqServerFireWhen_Pre_State_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Post_Status_Check( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Post_Status state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Post_Status_Ok: { + /* + * The return status of rtems_timer_server_fire_when() shall be + * RTEMS_SUCCESSFUL. + */ + T_rsc_success( ctx->status ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Status_NotDef: { + /* + * The return status of rtems_timer_server_fire_when() shall be + * RTEMS_NOT_DEFINED + */ + T_rsc( ctx->status, RTEMS_NOT_DEFINED ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Status_InvId: { + /* + * The return status of rtems_timer_server_fire_when() shall be + * RTEMS_INVALID_ID. + */ + T_rsc( ctx->status, RTEMS_INVALID_ID ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Status_InvAddr: { + /* + * The return status of rtems_timer_server_fire_when() shall be + * RTEMS_INVALID_ADDRESS. + */ + T_rsc( ctx->status, RTEMS_INVALID_ADDRESS ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Status_InvClock: { + /* + * The return status of rtems_timer_server_fire_when() shall be + * RTEMS_INVALID_CLOCK. + */ + T_rsc( ctx->status, RTEMS_INVALID_CLOCK ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Status_IncStat: { + /* + * The return status of rtems_timer_server_fire_when() shall be + * RTEMS_INCORRECT_STATE. + */ + T_rsc( ctx->status, RTEMS_INCORRECT_STATE ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Status_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Post_Context_Check( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Post_Context state +) +{ + Timer_Classes class; + class = GetTimerClass( ctx->timer_id ); + + switch ( state ) { + case RtemsTimerReqServerFireWhen_Post_Context_None: { + /* + * The timer shall have never been scheduled. See also none. + */ + T_eq_int( class, TIMER_DORMANT ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Context_Interrupt: { + /* + * The timer shall be in interrupt context. + */ + T_eq_int( class & TIMER_CLASS_BIT_ON_TASK, 0 ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Context_Server: { + /* + * The timer shall be in server context. + */ + T_eq_int( class & TIMER_CLASS_BIT_ON_TASK, TIMER_CLASS_BIT_ON_TASK ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Context_Nop: { + /* + * Objects referenced by parameters in the past call to + * rtems_timer_server_fire_when() shall not be accessed by the + * rtems_timer_server_fire_when() call. See also Nop. + */ + T_eq_int( class, ctx->pre_class ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Context_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Post_Clock_Check( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Post_Clock state +) +{ + Timer_Classes class; + class = GetTimerClass( ctx->timer_id ); + + switch ( state ) { + case RtemsTimerReqServerFireWhen_Post_Clock_None: { + /* + * The timer shall have never been scheduled. + */ + T_eq_int( class, TIMER_DORMANT ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Clock_Ticks: { + /* + * The timer shall use the ticks based clock. + */ + T_eq_int( class & TIMER_CLASS_BIT_TIME_OF_DAY, 0 ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Clock_Realtime: { + /* + * The timer shall use the realtime clock. + */ + T_eq_int( + class & TIMER_CLASS_BIT_TIME_OF_DAY, + TIMER_CLASS_BIT_TIME_OF_DAY + ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Clock_Nop: { + /* + * Objects referenced by parameters in the past call to + * rtems_timer_server_fire_when() shall not be accessed by the + * rtems_timer_server_fire_when() call. + */ + T_eq_int( class, ctx->pre_class ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Clock_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Post_State_Check( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Post_State state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Post_State_Scheduled: { + /* + * The timer shall be in scheduled state. + */ + TriggerTimer( ctx, &ctx->tod_till_fire ); + T_eq_int( ctx->invocations, 1 ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_State_Nop: { + /* + * Objects referenced by parameters in the past call to + * rtems_timer_server_fire_when() shall not be accessed by the + * rtems_timer_server_fire_when() call. + */ + T_eq_int( ctx->post_state, ctx->pre_state ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_State_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Post_WallTime_Check( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Post_WallTime state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Post_WallTime_Param: { + /* + * The Timer Service Routine shall be invoked at the wall time (see + * realtime clock) (ignoring ticks), which was provided by the + * ``wall_time`` parameter in the past call to + * rtems_timer_server_fire_when(). + */ + T_eq_mem( + &ctx->tod_till_fire, + ctx->wall_time_param, + sizeof( ctx->tod_till_fire ) + ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_WallTime_Nop: { + /* + * If and when the Timer Service Routine will be invoked shall not be + * changed by the past call to rtems_timer_server_fire_when(). + */ + /* + * Whether the timer is scheduled has already been tested by the + * "Nop" "State" post-condition above. + */ + T_eq_u32( + ctx->post_scheduling_data.interval, + ctx->pre_scheduling_data.interval + ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_WallTime_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Post_Routine_Check( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Post_Routine state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Post_Routine_Param: { + /* + * The function reference used to invoke the Timer Service Routine when + * the timer will fire shall be the one provided by the ``routine`` + * parameter in the past call to rtems_timer_server_fire_when(). + */ + T_eq_int( ctx->invocations, 1 ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Routine_Nop: { + /* + * The function reference used for any invocation of the Timer Service + * Routine shall not be changed by the past call to + * rtems_timer_server_fire_when(). + */ + T_eq_ptr( + ctx->post_scheduling_data.routine, + ctx->pre_scheduling_data.routine + ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_Routine_NA: + break; + } +} + +static void RtemsTimerReqServerFireWhen_Post_UserData_Check( + RtemsTimerReqServerFireWhen_Context *ctx, + RtemsTimerReqServerFireWhen_Post_UserData state +) +{ + switch ( state ) { + case RtemsTimerReqServerFireWhen_Post_UserData_Param: { + /* + * The user data argument for invoking the Timer Service Routine when the + * timer will fire shall be the one provided by the ``user_data`` + * parameter in the past call to rtems_timer_server_fire_when(). + */ + T_eq_ptr( ctx->routine_user_data, ctx ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_UserData_Nop: { + /* + * The user data argument used for any invocation of the Timer Service + * Routine shall not be changed by the past call to + * rtems_timer_server_fire_when(). + */ + T_eq_ptr( + ctx->post_scheduling_data.user_data, + ctx->pre_scheduling_data.user_data + ); + break; + } + + case RtemsTimerReqServerFireWhen_Post_UserData_NA: + break; + } +} + +/** + * @brief Make sure the realtime clock is not set after this test. + */ +static void RtemsTimerReqServerFireWhen_Teardown( + RtemsTimerReqServerFireWhen_Context *ctx +) +{ + UnsetClock(); +} + +static void RtemsTimerReqServerFireWhen_Teardown_Wrap( void *arg ) +{ + RtemsTimerReqServerFireWhen_Context *ctx; + + ctx = arg; + ctx->in_action_loop = false; + RtemsTimerReqServerFireWhen_Teardown( ctx ); +} + +static void RtemsTimerReqServerFireWhen_Prepare( + RtemsTimerReqServerFireWhen_Context *ctx +) +{ + rtems_status_code status; + status = rtems_timer_create( + rtems_build_name( 'T', 'I', 'M', 'E' ), + &ctx->timer_id + ); + T_rsc_success( status ); + + ctx->invocations = 0; + ctx->routine_user_data = NULL; +} + +static void RtemsTimerReqServerFireWhen_Action( + RtemsTimerReqServerFireWhen_Context *ctx +) +{ + GetTimerSchedulingData( ctx->timer_id, &ctx->pre_scheduling_data ); + ctx->pre_class = GetTimerClass( ctx->timer_id ); + if ( ctx->pre_cond_tod == NULL ) { + UnsetClock(); + } else { + T_rsc_success( rtems_clock_set( ctx->pre_cond_tod ) ); + } + ctx->status = rtems_timer_server_fire_when( + ctx->id_param, + ctx->wall_time_param, + ctx->routine_param, + ctx + ); + ctx->post_state = GetTimerState( ctx->timer_id ); + GetTimerSchedulingData( ctx->timer_id, &ctx->post_scheduling_data ); + /* Ignoring return status: the timer server task may be suspended or not. */ + rtems_task_resume( GetTimerServerTaskId() ); +} + +static void RtemsTimerReqServerFireWhen_Cleanup( + RtemsTimerReqServerFireWhen_Context *ctx +) +{ + T_rsc_success( rtems_timer_delete( ctx->timer_id ) ); + DeleteTimerServer(); +} + +typedef struct { + uint32_t Skip : 1; + uint32_t Pre_Server_NA : 1; + uint32_t Pre_RtClock_NA : 1; + uint32_t Pre_Routine_NA : 1; + uint32_t Pre_WallTime_NA : 1; + uint32_t Pre_Id_NA : 1; + uint32_t Pre_Context_NA : 1; + uint32_t Pre_Clock_NA : 1; + uint32_t Pre_State_NA : 1; + uint32_t Post_Status : 3; + uint32_t Post_Context : 3; + uint32_t Post_Clock : 3; + uint32_t Post_State : 2; + uint32_t Post_WallTime : 2; + uint32_t Post_Routine : 2; + uint32_t Post_UserData : 2; +} RtemsTimerReqServerFireWhen_Entry; + +static const RtemsTimerReqServerFireWhen_Entry +RtemsTimerReqServerFireWhen_Entries[] = { + { 1, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NA, + RtemsTimerReqServerFireWhen_Post_Context_NA, + RtemsTimerReqServerFireWhen_Post_Clock_NA, + RtemsTimerReqServerFireWhen_Post_State_NA, + RtemsTimerReqServerFireWhen_Post_WallTime_NA, + RtemsTimerReqServerFireWhen_Post_Routine_NA, + RtemsTimerReqServerFireWhen_Post_UserData_NA }, + { 1, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NA, + RtemsTimerReqServerFireWhen_Post_Context_NA, + RtemsTimerReqServerFireWhen_Post_Clock_NA, + RtemsTimerReqServerFireWhen_Post_State_NA, + RtemsTimerReqServerFireWhen_Post_WallTime_NA, + RtemsTimerReqServerFireWhen_Post_Routine_NA, + RtemsTimerReqServerFireWhen_Post_UserData_NA }, + { 1, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NA, + RtemsTimerReqServerFireWhen_Post_Context_NA, + RtemsTimerReqServerFireWhen_Post_Clock_NA, + RtemsTimerReqServerFireWhen_Post_State_NA, + RtemsTimerReqServerFireWhen_Post_WallTime_NA, + RtemsTimerReqServerFireWhen_Post_Routine_NA, + RtemsTimerReqServerFireWhen_Post_UserData_NA }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_IncStat, + RtemsTimerReqServerFireWhen_Post_Context_Nop, + RtemsTimerReqServerFireWhen_Post_Clock_Nop, + RtemsTimerReqServerFireWhen_Post_State_Nop, + RtemsTimerReqServerFireWhen_Post_WallTime_Nop, + RtemsTimerReqServerFireWhen_Post_Routine_Nop, + RtemsTimerReqServerFireWhen_Post_UserData_Nop }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_InvAddr, + RtemsTimerReqServerFireWhen_Post_Context_Nop, + RtemsTimerReqServerFireWhen_Post_Clock_Nop, + RtemsTimerReqServerFireWhen_Post_State_Nop, + RtemsTimerReqServerFireWhen_Post_WallTime_Nop, + RtemsTimerReqServerFireWhen_Post_Routine_Nop, + RtemsTimerReqServerFireWhen_Post_UserData_Nop }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NotDef, + RtemsTimerReqServerFireWhen_Post_Context_Nop, + RtemsTimerReqServerFireWhen_Post_Clock_Nop, + RtemsTimerReqServerFireWhen_Post_State_Nop, + RtemsTimerReqServerFireWhen_Post_WallTime_Nop, + RtemsTimerReqServerFireWhen_Post_Routine_Nop, + RtemsTimerReqServerFireWhen_Post_UserData_Nop }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, + RtemsTimerReqServerFireWhen_Post_Status_InvClock, + RtemsTimerReqServerFireWhen_Post_Context_Nop, + RtemsTimerReqServerFireWhen_Post_Clock_Nop, + RtemsTimerReqServerFireWhen_Post_State_Nop, + RtemsTimerReqServerFireWhen_Post_WallTime_Nop, + RtemsTimerReqServerFireWhen_Post_Routine_Nop, + RtemsTimerReqServerFireWhen_Post_UserData_Nop }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_Ok, + RtemsTimerReqServerFireWhen_Post_Context_Server, + RtemsTimerReqServerFireWhen_Post_Clock_Realtime, + RtemsTimerReqServerFireWhen_Post_State_Scheduled, + RtemsTimerReqServerFireWhen_Post_WallTime_Param, + RtemsTimerReqServerFireWhen_Post_Routine_Param, + RtemsTimerReqServerFireWhen_Post_UserData_Param }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_InvId, + RtemsTimerReqServerFireWhen_Post_Context_Nop, + RtemsTimerReqServerFireWhen_Post_Clock_Nop, + RtemsTimerReqServerFireWhen_Post_State_Nop, + RtemsTimerReqServerFireWhen_Post_WallTime_Nop, + RtemsTimerReqServerFireWhen_Post_Routine_Nop, + RtemsTimerReqServerFireWhen_Post_UserData_Nop } +}; + +static const uint8_t +RtemsTimerReqServerFireWhen_Map[] = { + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 8, 8, 8, 8, + 8, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 6, 6, 0, 0, 0, 0, 6, 6, 6, + 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 6, 6, 0, 0, 0, 0, 6, 6, + 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 6, 6, 0, 0, 0, 0, 6, + 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 6, 6, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, 0, 0, 0, + 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, 0, 0, + 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, 0, + 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, + 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, + 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, + 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, + 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 4, 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 4, 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, + 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, + 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, + 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, + 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, + 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, + 5, 5, 5, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, + 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, + 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, + 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, + 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, + 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, + 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1 +}; + +static size_t RtemsTimerReqServerFireWhen_Scope( + void *arg, + char *buf, + size_t n +) +{ + RtemsTimerReqServerFireWhen_Context *ctx; + + ctx = arg; + + if ( ctx->in_action_loop ) { + return T_get_scope( + RtemsTimerReqServerFireWhen_PreDesc, + buf, + n, + ctx->pcs + ); + } + + return 0; +} + +static T_fixture RtemsTimerReqServerFireWhen_Fixture = { + .setup = NULL, + .stop = NULL, + .teardown = RtemsTimerReqServerFireWhen_Teardown_Wrap, + .scope = RtemsTimerReqServerFireWhen_Scope, + .initial_context = &RtemsTimerReqServerFireWhen_Instance +}; + +static inline RtemsTimerReqServerFireWhen_Entry +RtemsTimerReqServerFireWhen_GetEntry( size_t index ) +{ + return RtemsTimerReqServerFireWhen_Entries[ + RtemsTimerReqServerFireWhen_Map[ index ] + ]; +} + +/** + * @fn void T_case_body_RtemsTimerReqServerFireWhen( void ) + */ +T_TEST_CASE_FIXTURE( + RtemsTimerReqServerFireWhen, + &RtemsTimerReqServerFireWhen_Fixture +) +{ + RtemsTimerReqServerFireWhen_Context *ctx; + size_t index; + + ctx = T_fixture_context(); + ctx->in_action_loop = true; + index = 0; + + for ( + ctx->pcs[ 0 ] = RtemsTimerReqServerFireWhen_Pre_Server_Init; + ctx->pcs[ 0 ] < RtemsTimerReqServerFireWhen_Pre_Server_NA; + ++ctx->pcs[ 0 ] + ) { + for ( + ctx->pcs[ 1 ] = RtemsTimerReqServerFireWhen_Pre_RtClock_Set; + ctx->pcs[ 1 ] < RtemsTimerReqServerFireWhen_Pre_RtClock_NA; + ++ctx->pcs[ 1 ] + ) { + for ( + ctx->pcs[ 2 ] = RtemsTimerReqServerFireWhen_Pre_Routine_Valid; + ctx->pcs[ 2 ] < RtemsTimerReqServerFireWhen_Pre_Routine_NA; + ++ctx->pcs[ 2 ] + ) { + for ( + ctx->pcs[ 3 ] = RtemsTimerReqServerFireWhen_Pre_WallTime_Valid; + ctx->pcs[ 3 ] < RtemsTimerReqServerFireWhen_Pre_WallTime_NA; + ++ctx->pcs[ 3 ] + ) { + for ( + ctx->pcs[ 4 ] = RtemsTimerReqServerFireWhen_Pre_Id_Valid; + ctx->pcs[ 4 ] < RtemsTimerReqServerFireWhen_Pre_Id_NA; + ++ctx->pcs[ 4 ] + ) { + for ( + ctx->pcs[ 5 ] = RtemsTimerReqServerFireWhen_Pre_Context_None; + ctx->pcs[ 5 ] < RtemsTimerReqServerFireWhen_Pre_Context_NA; + ++ctx->pcs[ 5 ] + ) { + for ( + ctx->pcs[ 6 ] = RtemsTimerReqServerFireWhen_Pre_Clock_None; + ctx->pcs[ 6 ] < RtemsTimerReqServerFireWhen_Pre_Clock_NA; + ++ctx->pcs[ 6 ] + ) { + for ( + ctx->pcs[ 7 ] = RtemsTimerReqServerFireWhen_Pre_State_Inactive; + ctx->pcs[ 7 ] < RtemsTimerReqServerFireWhen_Pre_State_NA; + ++ctx->pcs[ 7 ] + ) { + RtemsTimerReqServerFireWhen_Entry entry; + + entry = RtemsTimerReqServerFireWhen_GetEntry( index ); + ++index; + + if ( entry.Skip ) { + continue; + } + + RtemsTimerReqServerFireWhen_Prepare( ctx ); + RtemsTimerReqServerFireWhen_Pre_Server_Prepare( + ctx, + ctx->pcs[ 0 ] + ); + RtemsTimerReqServerFireWhen_Pre_RtClock_Prepare( + ctx, + ctx->pcs[ 1 ] + ); + RtemsTimerReqServerFireWhen_Pre_Routine_Prepare( + ctx, + ctx->pcs[ 2 ] + ); + RtemsTimerReqServerFireWhen_Pre_WallTime_Prepare( + ctx, + ctx->pcs[ 3 ] + ); + RtemsTimerReqServerFireWhen_Pre_Id_Prepare( + ctx, + ctx->pcs[ 4 ] + ); + RtemsTimerReqServerFireWhen_Pre_Context_Prepare( + ctx, + ctx->pcs[ 5 ] + ); + RtemsTimerReqServerFireWhen_Pre_Clock_Prepare( + ctx, + ctx->pcs[ 6 ] + ); + RtemsTimerReqServerFireWhen_Pre_State_Prepare( + ctx, + ctx->pcs[ 7 ] + ); + RtemsTimerReqServerFireWhen_Action( ctx ); + RtemsTimerReqServerFireWhen_Post_Status_Check( + ctx, + entry.Post_Status + ); + RtemsTimerReqServerFireWhen_Post_Context_Check( + ctx, + entry.Post_Context + ); + RtemsTimerReqServerFireWhen_Post_Clock_Check( + ctx, + entry.Post_Clock + ); + RtemsTimerReqServerFireWhen_Post_State_Check( + ctx, + entry.Post_State + ); + RtemsTimerReqServerFireWhen_Post_WallTime_Check( + ctx, + entry.Post_WallTime + ); + RtemsTimerReqServerFireWhen_Post_Routine_Check( + ctx, + entry.Post_Routine + ); + RtemsTimerReqServerFireWhen_Post_UserData_Check( + ctx, + entry.Post_UserData + ); + RtemsTimerReqServerFireWhen_Cleanup( ctx ); + } + } + } + } + } + } + } + } +} + +/** @} */ -- cgit v1.2.3