Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:53

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RtemsTimerReqServerFireWhen
0007  */
0008 
0009 /*
0010  * Copyright (C) 2021 embedded brains GmbH & Co. KG
0011  *
0012  * Redistribution and use in source and binary forms, with or without
0013  * modification, are permitted provided that the following conditions
0014  * are met:
0015  * 1. Redistributions of source code must retain the above copyright
0016  *    notice, this list of conditions and the following disclaimer.
0017  * 2. Redistributions in binary form must reproduce the above copyright
0018  *    notice, this list of conditions and the following disclaimer in the
0019  *    documentation and/or other materials provided with the distribution.
0020  *
0021  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0022  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0023  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0024  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0025  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0026  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0027  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0028  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0029  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0030  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0031  * POSSIBILITY OF SUCH DAMAGE.
0032  */
0033 
0034 /*
0035  * This file is part of the RTEMS quality process and was automatically
0036  * generated.  If you find something that needs to be fixed or
0037  * worded better please post a report or patch to an RTEMS mailing list
0038  * or raise a bug report:
0039  *
0040  * https://www.rtems.org/bugs.html
0041  *
0042  * For information on updating and regenerating please refer to the How-To
0043  * section in the Software Requirements Engineering chapter of the
0044  * RTEMS Software Engineering manual.  The manual is provided as a part of
0045  * a release.  For development sources please refer to the online
0046  * documentation at:
0047  *
0048  * https://docs.rtems.org
0049  */
0050 
0051 #ifdef HAVE_CONFIG_H
0052 #include "config.h"
0053 #endif
0054 
0055 #include <rtems.h>
0056 
0057 #include "tx-support.h"
0058 
0059 #include <rtems/test.h>
0060 
0061 /**
0062  * @defgroup RtemsTimerReqServerFireWhen spec:/rtems/timer/req/server-fire-when
0063  *
0064  * @ingroup TestsuitesValidationNoClock0
0065  *
0066  * @{
0067  */
0068 
0069 typedef enum {
0070   RtemsTimerReqServerFireWhen_Pre_Server_Init,
0071   RtemsTimerReqServerFireWhen_Pre_Server_NotInit,
0072   RtemsTimerReqServerFireWhen_Pre_Server_NA
0073 } RtemsTimerReqServerFireWhen_Pre_Server;
0074 
0075 typedef enum {
0076   RtemsTimerReqServerFireWhen_Pre_RtClock_Set,
0077   RtemsTimerReqServerFireWhen_Pre_RtClock_Unset,
0078   RtemsTimerReqServerFireWhen_Pre_RtClock_NA
0079 } RtemsTimerReqServerFireWhen_Pre_RtClock;
0080 
0081 typedef enum {
0082   RtemsTimerReqServerFireWhen_Pre_Routine_Valid,
0083   RtemsTimerReqServerFireWhen_Pre_Routine_Null,
0084   RtemsTimerReqServerFireWhen_Pre_Routine_NA
0085 } RtemsTimerReqServerFireWhen_Pre_Routine;
0086 
0087 typedef enum {
0088   RtemsTimerReqServerFireWhen_Pre_WallTime_Valid,
0089   RtemsTimerReqServerFireWhen_Pre_WallTime_Invalid,
0090   RtemsTimerReqServerFireWhen_Pre_WallTime_Past,
0091   RtemsTimerReqServerFireWhen_Pre_WallTime_Null,
0092   RtemsTimerReqServerFireWhen_Pre_WallTime_NA
0093 } RtemsTimerReqServerFireWhen_Pre_WallTime;
0094 
0095 typedef enum {
0096   RtemsTimerReqServerFireWhen_Pre_Id_Valid,
0097   RtemsTimerReqServerFireWhen_Pre_Id_Invalid,
0098   RtemsTimerReqServerFireWhen_Pre_Id_NA
0099 } RtemsTimerReqServerFireWhen_Pre_Id;
0100 
0101 typedef enum {
0102   RtemsTimerReqServerFireWhen_Pre_Context_None,
0103   RtemsTimerReqServerFireWhen_Pre_Context_Interrupt,
0104   RtemsTimerReqServerFireWhen_Pre_Context_Server,
0105   RtemsTimerReqServerFireWhen_Pre_Context_NA
0106 } RtemsTimerReqServerFireWhen_Pre_Context;
0107 
0108 typedef enum {
0109   RtemsTimerReqServerFireWhen_Pre_Clock_None,
0110   RtemsTimerReqServerFireWhen_Pre_Clock_Ticks,
0111   RtemsTimerReqServerFireWhen_Pre_Clock_Realtime,
0112   RtemsTimerReqServerFireWhen_Pre_Clock_NA
0113 } RtemsTimerReqServerFireWhen_Pre_Clock;
0114 
0115 typedef enum {
0116   RtemsTimerReqServerFireWhen_Pre_State_Inactive,
0117   RtemsTimerReqServerFireWhen_Pre_State_Scheduled,
0118   RtemsTimerReqServerFireWhen_Pre_State_Pending,
0119   RtemsTimerReqServerFireWhen_Pre_State_NA
0120 } RtemsTimerReqServerFireWhen_Pre_State;
0121 
0122 typedef enum {
0123   RtemsTimerReqServerFireWhen_Post_Status_Ok,
0124   RtemsTimerReqServerFireWhen_Post_Status_NotDef,
0125   RtemsTimerReqServerFireWhen_Post_Status_InvId,
0126   RtemsTimerReqServerFireWhen_Post_Status_InvAddr,
0127   RtemsTimerReqServerFireWhen_Post_Status_InvClock,
0128   RtemsTimerReqServerFireWhen_Post_Status_IncStat,
0129   RtemsTimerReqServerFireWhen_Post_Status_NA
0130 } RtemsTimerReqServerFireWhen_Post_Status;
0131 
0132 typedef enum {
0133   RtemsTimerReqServerFireWhen_Post_Context_None,
0134   RtemsTimerReqServerFireWhen_Post_Context_Interrupt,
0135   RtemsTimerReqServerFireWhen_Post_Context_Server,
0136   RtemsTimerReqServerFireWhen_Post_Context_Nop,
0137   RtemsTimerReqServerFireWhen_Post_Context_NA
0138 } RtemsTimerReqServerFireWhen_Post_Context;
0139 
0140 typedef enum {
0141   RtemsTimerReqServerFireWhen_Post_Clock_None,
0142   RtemsTimerReqServerFireWhen_Post_Clock_Ticks,
0143   RtemsTimerReqServerFireWhen_Post_Clock_Realtime,
0144   RtemsTimerReqServerFireWhen_Post_Clock_Nop,
0145   RtemsTimerReqServerFireWhen_Post_Clock_NA
0146 } RtemsTimerReqServerFireWhen_Post_Clock;
0147 
0148 typedef enum {
0149   RtemsTimerReqServerFireWhen_Post_State_Scheduled,
0150   RtemsTimerReqServerFireWhen_Post_State_Nop,
0151   RtemsTimerReqServerFireWhen_Post_State_NA
0152 } RtemsTimerReqServerFireWhen_Post_State;
0153 
0154 typedef enum {
0155   RtemsTimerReqServerFireWhen_Post_WallTime_Param,
0156   RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
0157   RtemsTimerReqServerFireWhen_Post_WallTime_NA
0158 } RtemsTimerReqServerFireWhen_Post_WallTime;
0159 
0160 typedef enum {
0161   RtemsTimerReqServerFireWhen_Post_Routine_Param,
0162   RtemsTimerReqServerFireWhen_Post_Routine_Nop,
0163   RtemsTimerReqServerFireWhen_Post_Routine_NA
0164 } RtemsTimerReqServerFireWhen_Post_Routine;
0165 
0166 typedef enum {
0167   RtemsTimerReqServerFireWhen_Post_UserData_Param,
0168   RtemsTimerReqServerFireWhen_Post_UserData_Nop,
0169   RtemsTimerReqServerFireWhen_Post_UserData_NA
0170 } RtemsTimerReqServerFireWhen_Post_UserData;
0171 
0172 typedef struct {
0173   uint32_t Skip : 1;
0174   uint32_t Pre_Server_NA : 1;
0175   uint32_t Pre_RtClock_NA : 1;
0176   uint32_t Pre_Routine_NA : 1;
0177   uint32_t Pre_WallTime_NA : 1;
0178   uint32_t Pre_Id_NA : 1;
0179   uint32_t Pre_Context_NA : 1;
0180   uint32_t Pre_Clock_NA : 1;
0181   uint32_t Pre_State_NA : 1;
0182   uint32_t Post_Status : 3;
0183   uint32_t Post_Context : 3;
0184   uint32_t Post_Clock : 3;
0185   uint32_t Post_State : 2;
0186   uint32_t Post_WallTime : 2;
0187   uint32_t Post_Routine : 2;
0188   uint32_t Post_UserData : 2;
0189 } RtemsTimerReqServerFireWhen_Entry;
0190 
0191 typedef enum {
0192   PRE_NONE      = 0,
0193   PRE_INTERRUPT = 1,
0194   PRE_SERVER    = 2
0195 } PreConditionContext;
0196 
0197 typedef enum {
0198   SCHEDULE_NONE  = 0,
0199   SCHEDULE_SOON  = 1,
0200   SCHEDULE_MAX   = 5
0201 } Scheduling_Ticks;
0202 
0203 /**
0204  * @brief Test context for spec:/rtems/timer/req/server-fire-when test case.
0205  */
0206 typedef struct {
0207   /**
0208    * @brief This member contains a valid id of a timer.
0209    */
0210   rtems_id timer_id;
0211 
0212   /**
0213    * @brief This member specifies the ``id`` parameter for the action.
0214    */
0215   rtems_id id_param;
0216 
0217   /**
0218    * @brief This member specifies the ``wall_time`` parameter for the action.
0219    */
0220   const rtems_time_of_day *wall_time_param;
0221 
0222   /**
0223    * @brief This member specifies the ``routine`` parameter for the action.
0224    */
0225   rtems_timer_service_routine_entry routine_param;
0226 
0227   /**
0228    * @brief This member contains the returned status code of the action.
0229    */
0230   rtems_status_code status;
0231 
0232   /**
0233    * @brief This member contains a counter of invocations of the Timer Service
0234    *   Routine.
0235    */
0236   int invocations;
0237 
0238   /**
0239    * @brief Function TriggerTimer() is used to figure out when the Timer
0240    *   Service Routine gets executed. This member contains the time-of-day when
0241    *   the Timer Service Routine fires (see fire).
0242    */
0243   rtems_time_of_day tod_till_fire;
0244 
0245   /**
0246    * @brief This member contains the user data given to the Timer Service
0247    *   Routine when called.
0248    */
0249   void *routine_user_data;
0250 
0251   /**
0252    * @brief This member specifies which pre-condition context (none, interrupt
0253    *   context, server context) must be created before the
0254    *   rtems_timer_server_fire_when() action gets executed.
0255    */
0256   PreConditionContext pre_cond_contex;
0257 
0258   /**
0259    * @brief This member specifies the pre-condition state of the realtime
0260    *   clock. It should either be set to the value referenced by pre_cond_tod
0261    *   or if NULL, then the realtime clock should be not set.
0262    */
0263   const rtems_time_of_day *pre_cond_tod;
0264 
0265   /**
0266    * @brief This member stores internal clock and context settings of the timer
0267    *   before the execution of the test action.
0268    */
0269   Timer_Classes pre_class;
0270 
0271   /**
0272    * @brief This member stores the state of the timer before the execution of
0273    *   the test action.
0274    */
0275   Timer_States pre_state;
0276 
0277   /**
0278    * @brief This member stores the state of the timer after the execution of
0279    *   the test action.
0280    */
0281   Timer_States post_state;
0282 
0283   /**
0284    * @brief This member stores the scheduling data of the timer before the
0285    *   execution of the test action.
0286    */
0287   Timer_Scheduling_Data pre_scheduling_data;
0288 
0289   /**
0290    * @brief This member stores the scheduling data of the timer after the
0291    *   execution of the test action.
0292    */
0293   Timer_Scheduling_Data post_scheduling_data;
0294 
0295   struct {
0296     /**
0297      * @brief This member defines the pre-condition states for the next action.
0298      */
0299     size_t pcs[ 8 ];
0300 
0301     /**
0302      * @brief If this member is true, then the test action loop is executed.
0303      */
0304     bool in_action_loop;
0305 
0306     /**
0307      * @brief This member contains the next transition map index.
0308      */
0309     size_t index;
0310 
0311     /**
0312      * @brief This member contains the current transition map entry.
0313      */
0314     RtemsTimerReqServerFireWhen_Entry entry;
0315 
0316     /**
0317      * @brief If this member is true, then the current transition variant
0318      *   should be skipped.
0319      */
0320     bool skip;
0321   } Map;
0322 } RtemsTimerReqServerFireWhen_Context;
0323 
0324 static RtemsTimerReqServerFireWhen_Context
0325   RtemsTimerReqServerFireWhen_Instance;
0326 
0327 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Server[] = {
0328   "Init",
0329   "NotInit",
0330   "NA"
0331 };
0332 
0333 static const char * const RtemsTimerReqServerFireWhen_PreDesc_RtClock[] = {
0334   "Set",
0335   "Unset",
0336   "NA"
0337 };
0338 
0339 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Routine[] = {
0340   "Valid",
0341   "Null",
0342   "NA"
0343 };
0344 
0345 static const char * const RtemsTimerReqServerFireWhen_PreDesc_WallTime[] = {
0346   "Valid",
0347   "Invalid",
0348   "Past",
0349   "Null",
0350   "NA"
0351 };
0352 
0353 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Id[] = {
0354   "Valid",
0355   "Invalid",
0356   "NA"
0357 };
0358 
0359 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Context[] = {
0360   "None",
0361   "Interrupt",
0362   "Server",
0363   "NA"
0364 };
0365 
0366 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Clock[] = {
0367   "None",
0368   "Ticks",
0369   "Realtime",
0370   "NA"
0371 };
0372 
0373 static const char * const RtemsTimerReqServerFireWhen_PreDesc_State[] = {
0374   "Inactive",
0375   "Scheduled",
0376   "Pending",
0377   "NA"
0378 };
0379 
0380 static const char * const * const RtemsTimerReqServerFireWhen_PreDesc[] = {
0381   RtemsTimerReqServerFireWhen_PreDesc_Server,
0382   RtemsTimerReqServerFireWhen_PreDesc_RtClock,
0383   RtemsTimerReqServerFireWhen_PreDesc_Routine,
0384   RtemsTimerReqServerFireWhen_PreDesc_WallTime,
0385   RtemsTimerReqServerFireWhen_PreDesc_Id,
0386   RtemsTimerReqServerFireWhen_PreDesc_Context,
0387   RtemsTimerReqServerFireWhen_PreDesc_Clock,
0388   RtemsTimerReqServerFireWhen_PreDesc_State,
0389   NULL
0390 };
0391 
0392 static const rtems_time_of_day tod_now      = { 2000, 1, 1, 0, 0, 0, 0 };
0393 static const rtems_time_of_day tod_schedule = { 2000, 1, 1, 5, 0, 0, 0 };
0394 static const rtems_time_of_day tod_invalid  = { 1985, 1, 1, 0, 0, 0, 0 };
0395 static const rtems_time_of_day tod_past     = { 1999, 12, 31, 23, 59, 59, 1 };
0396 
0397 static void TriggerTimer(
0398   const RtemsTimerReqServerFireWhen_Context *ctx,
0399   rtems_time_of_day *tod_fire
0400 )
0401 {
0402   rtems_time_of_day tod = tod_now;
0403   int invocations_old = ctx->invocations;
0404   int i;
0405 
0406   /* Fire the timer service routine for ticks and realtime clock */
0407   for ( i = 1; i <= SCHEDULE_MAX; ++i ) {
0408     ClockTick();
0409   }
0410 
0411   for ( i = 1; i < 24; ++i ) {
0412     tod.hour = i;
0413     T_rsc_success( rtems_clock_set( &tod ) );
0414     if ( tod_fire != NULL && ctx->invocations > invocations_old ) {
0415       *tod_fire = tod;
0416       break;
0417     }
0418   }
0419 }
0420 
0421 static void TimerServiceRoutine(
0422   rtems_id timer_id,
0423   void *user_data
0424 )
0425 {
0426   RtemsTimerReqServerFireWhen_Context *ctx = user_data;
0427   ++( ctx->invocations );
0428   ctx->routine_user_data = user_data;
0429 }
0430 
0431 static void RtemsTimerReqServerFireWhen_Pre_Server_Prepare(
0432   RtemsTimerReqServerFireWhen_Context   *ctx,
0433   RtemsTimerReqServerFireWhen_Pre_Server state
0434 )
0435 {
0436   switch ( state ) {
0437     case RtemsTimerReqServerFireWhen_Pre_Server_Init: {
0438       /*
0439        * While the Timer Server task has been successfully initialized by a
0440        * call to rtems_timer_initiate_server().
0441        */
0442       rtems_status_code status;
0443       status = rtems_timer_initiate_server(
0444         RTEMS_TIMER_SERVER_DEFAULT_PRIORITY,
0445         RTEMS_MINIMUM_STACK_SIZE,
0446         RTEMS_DEFAULT_ATTRIBUTES
0447       );
0448       T_rsc_success( status );
0449       break;
0450     }
0451 
0452     case RtemsTimerReqServerFireWhen_Pre_Server_NotInit: {
0453       /*
0454        * While the Timer Server task has not been initialized and does not
0455        * exist.
0456        */
0457       DeleteTimerServer();
0458       break;
0459     }
0460 
0461     case RtemsTimerReqServerFireWhen_Pre_Server_NA:
0462       break;
0463   }
0464 }
0465 
0466 static void RtemsTimerReqServerFireWhen_Pre_RtClock_Prepare(
0467   RtemsTimerReqServerFireWhen_Context    *ctx,
0468   RtemsTimerReqServerFireWhen_Pre_RtClock state
0469 )
0470 {
0471   switch ( state ) {
0472     case RtemsTimerReqServerFireWhen_Pre_RtClock_Set: {
0473       /*
0474        * While the realtime clock is set to a valid time-of-day.
0475        */
0476       ctx->pre_cond_tod = &tod_now;
0477       break;
0478     }
0479 
0480     case RtemsTimerReqServerFireWhen_Pre_RtClock_Unset: {
0481       /*
0482        * While the realtime clock has never been set.
0483        */
0484       ctx->pre_cond_tod = NULL;
0485       break;
0486     }
0487 
0488     case RtemsTimerReqServerFireWhen_Pre_RtClock_NA:
0489       break;
0490   }
0491 }
0492 
0493 static void RtemsTimerReqServerFireWhen_Pre_Routine_Prepare(
0494   RtemsTimerReqServerFireWhen_Context    *ctx,
0495   RtemsTimerReqServerFireWhen_Pre_Routine state
0496 )
0497 {
0498   switch ( state ) {
0499     case RtemsTimerReqServerFireWhen_Pre_Routine_Valid: {
0500       /*
0501        * While the ``routine`` parameter references an object of type
0502        * rtems_timer_service_routine_entry.
0503        */
0504       ctx->routine_param = TimerServiceRoutine;
0505       break;
0506     }
0507 
0508     case RtemsTimerReqServerFireWhen_Pre_Routine_Null: {
0509       /*
0510        * While the ``routine`` parameter is NULL..
0511        */
0512       ctx->routine_param = NULL;
0513       break;
0514     }
0515 
0516     case RtemsTimerReqServerFireWhen_Pre_Routine_NA:
0517       break;
0518   }
0519 }
0520 
0521 static void RtemsTimerReqServerFireWhen_Pre_WallTime_Prepare(
0522   RtemsTimerReqServerFireWhen_Context     *ctx,
0523   RtemsTimerReqServerFireWhen_Pre_WallTime state
0524 )
0525 {
0526   switch ( state ) {
0527     case RtemsTimerReqServerFireWhen_Pre_WallTime_Valid: {
0528       /*
0529        * While the ``wall_time`` parameter references a time at least one
0530        * second in the future but not later than the last second of the year
0531        * 2105. (Times after 2105 are invalid.)
0532        */
0533       ctx->wall_time_param = &tod_schedule;
0534       break;
0535     }
0536 
0537     case RtemsTimerReqServerFireWhen_Pre_WallTime_Invalid: {
0538       /*
0539        * While the ``wall_time`` parameter is invalid.
0540        */
0541       ctx->wall_time_param = &tod_invalid;
0542       break;
0543     }
0544 
0545     case RtemsTimerReqServerFireWhen_Pre_WallTime_Past: {
0546       /*
0547        * While the ``wall_time`` parameter references a time in the current
0548        * second or in the past but not earlier than 1988. (Times before 1988
0549        * are invalid.)
0550        */
0551       ctx->wall_time_param = &tod_past;
0552       break;
0553     }
0554 
0555     case RtemsTimerReqServerFireWhen_Pre_WallTime_Null: {
0556       /*
0557        * While the ``wall_time`` parameter is 0.
0558        */
0559       ctx->wall_time_param = NULL;
0560       break;
0561     }
0562 
0563     case RtemsTimerReqServerFireWhen_Pre_WallTime_NA:
0564       break;
0565   }
0566 }
0567 
0568 static void RtemsTimerReqServerFireWhen_Pre_Id_Prepare(
0569   RtemsTimerReqServerFireWhen_Context *ctx,
0570   RtemsTimerReqServerFireWhen_Pre_Id   state
0571 )
0572 {
0573   switch ( state ) {
0574     case RtemsTimerReqServerFireWhen_Pre_Id_Valid: {
0575       /*
0576        * While the ``id`` parameter is valid.
0577        */
0578       ctx->id_param = ctx->timer_id;
0579       break;
0580     }
0581 
0582     case RtemsTimerReqServerFireWhen_Pre_Id_Invalid: {
0583       /*
0584        * While the ``id`` parameter is invalid.
0585        */
0586       ctx->id_param = RTEMS_ID_NONE;
0587       break;
0588     }
0589 
0590     case RtemsTimerReqServerFireWhen_Pre_Id_NA:
0591       break;
0592   }
0593 }
0594 
0595 static void RtemsTimerReqServerFireWhen_Pre_Context_Prepare(
0596   RtemsTimerReqServerFireWhen_Context    *ctx,
0597   RtemsTimerReqServerFireWhen_Pre_Context state
0598 )
0599 {
0600   switch ( state ) {
0601     case RtemsTimerReqServerFireWhen_Pre_Context_None: {
0602       /*
0603        * While the Timer Service Routine has never been scheduled since
0604        * creation of the timer. See also none.
0605        */
0606       ctx->pre_cond_contex = PRE_NONE;
0607       break;
0608     }
0609 
0610     case RtemsTimerReqServerFireWhen_Pre_Context_Interrupt: {
0611       /*
0612        * While the timer is in interrupt context.
0613        */
0614       ctx->pre_cond_contex = PRE_INTERRUPT;
0615       break;
0616     }
0617 
0618     case RtemsTimerReqServerFireWhen_Pre_Context_Server: {
0619       /*
0620        * While the timer is in server context.
0621        */
0622       ctx->pre_cond_contex = PRE_SERVER;
0623       break;
0624     }
0625 
0626     case RtemsTimerReqServerFireWhen_Pre_Context_NA:
0627       break;
0628   }
0629 }
0630 
0631 static void RtemsTimerReqServerFireWhen_Pre_Clock_Prepare(
0632   RtemsTimerReqServerFireWhen_Context  *ctx,
0633   RtemsTimerReqServerFireWhen_Pre_Clock state
0634 )
0635 {
0636   switch ( state ) {
0637     case RtemsTimerReqServerFireWhen_Pre_Clock_None: {
0638       /*
0639        * While the timer has never been scheduled since creation of the timer.
0640        */
0641       T_eq_int( ctx->pre_cond_contex, PRE_NONE );
0642       break;
0643     }
0644 
0645     case RtemsTimerReqServerFireWhen_Pre_Clock_Ticks: {
0646       /*
0647        * While the clock used to determine when the timer will fire is the
0648        * ticks based clock.
0649        */
0650       rtems_status_code status;
0651 
0652       if ( ctx->pre_cond_contex == PRE_INTERRUPT ) {
0653         status = rtems_timer_fire_after(
0654           ctx->timer_id,
0655           SCHEDULE_SOON,
0656           TimerServiceRoutine,
0657           ctx
0658         );
0659       } else {
0660         status = rtems_timer_server_fire_after(
0661           ctx->timer_id,
0662           SCHEDULE_SOON,
0663           TimerServiceRoutine,
0664           ctx
0665         );
0666       }
0667       T_rsc_success( status );
0668       break;
0669     }
0670 
0671     case RtemsTimerReqServerFireWhen_Pre_Clock_Realtime: {
0672       /*
0673        * While the clock used to determine when the timer will fire is the
0674        * realtime clock.
0675        */
0676       rtems_status_code status;
0677       T_rsc_success( rtems_clock_set( &tod_now ) );
0678 
0679       if ( ctx->pre_cond_contex == PRE_INTERRUPT ) {
0680         status = rtems_timer_fire_when(
0681           ctx->timer_id,
0682           &tod_schedule,
0683           TimerServiceRoutine,
0684           ctx
0685         );
0686       } else {
0687         status = rtems_timer_server_fire_when(
0688           ctx->timer_id,
0689           &tod_schedule,
0690           TimerServiceRoutine,
0691           ctx
0692         );
0693       }
0694       T_rsc_success( status );
0695       break;
0696     }
0697 
0698     case RtemsTimerReqServerFireWhen_Pre_Clock_NA:
0699       break;
0700   }
0701 }
0702 
0703 static void RtemsTimerReqServerFireWhen_Pre_State_Prepare(
0704   RtemsTimerReqServerFireWhen_Context  *ctx,
0705   RtemsTimerReqServerFireWhen_Pre_State state
0706 )
0707 {
0708   switch ( state ) {
0709     case RtemsTimerReqServerFireWhen_Pre_State_Inactive: {
0710       /*
0711        * While the timer is in inactive state.
0712        */
0713       TriggerTimer( ctx, NULL );
0714       T_eq_int(
0715         ctx->invocations,
0716         ( ctx->pre_cond_contex == PRE_NONE ) ? 0 : 1
0717       );
0718       ctx->invocations = 0;
0719       ctx->pre_state = TIMER_INACTIVE;
0720       break;
0721     }
0722 
0723     case RtemsTimerReqServerFireWhen_Pre_State_Scheduled: {
0724       /*
0725        * While the timer is in scheduled state.
0726        */
0727       /* The timer was already scheduled in the "Clock" pre-conditions. */
0728       ctx->pre_state = TIMER_SCHEDULED;
0729       break;
0730     }
0731 
0732     case RtemsTimerReqServerFireWhen_Pre_State_Pending: {
0733       /*
0734        * While the timer is in pending state.
0735        */
0736       T_rsc_success( rtems_task_suspend( GetTimerServerTaskId() ) );
0737       TriggerTimer( ctx, NULL );
0738       T_eq_int( ctx->invocations, 0 );
0739       ctx->pre_state = TIMER_PENDING;
0740       break;
0741     }
0742 
0743     case RtemsTimerReqServerFireWhen_Pre_State_NA:
0744       break;
0745   }
0746 }
0747 
0748 static void RtemsTimerReqServerFireWhen_Post_Status_Check(
0749   RtemsTimerReqServerFireWhen_Context    *ctx,
0750   RtemsTimerReqServerFireWhen_Post_Status state
0751 )
0752 {
0753   switch ( state ) {
0754     case RtemsTimerReqServerFireWhen_Post_Status_Ok: {
0755       /*
0756        * The return status of rtems_timer_server_fire_when() shall be
0757        * RTEMS_SUCCESSFUL.
0758        */
0759       T_rsc_success( ctx->status );
0760       break;
0761     }
0762 
0763     case RtemsTimerReqServerFireWhen_Post_Status_NotDef: {
0764       /*
0765        * The return status of rtems_timer_server_fire_when() shall be
0766        * RTEMS_NOT_DEFINED
0767        */
0768       T_rsc( ctx->status, RTEMS_NOT_DEFINED );
0769       break;
0770     }
0771 
0772     case RtemsTimerReqServerFireWhen_Post_Status_InvId: {
0773       /*
0774        * The return status of rtems_timer_server_fire_when() shall be
0775        * RTEMS_INVALID_ID.
0776        */
0777       T_rsc( ctx->status, RTEMS_INVALID_ID );
0778       break;
0779     }
0780 
0781     case RtemsTimerReqServerFireWhen_Post_Status_InvAddr: {
0782       /*
0783        * The return status of rtems_timer_server_fire_when() shall be
0784        * RTEMS_INVALID_ADDRESS.
0785        */
0786       T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
0787       break;
0788     }
0789 
0790     case RtemsTimerReqServerFireWhen_Post_Status_InvClock: {
0791       /*
0792        * The return status of rtems_timer_server_fire_when() shall be
0793        * RTEMS_INVALID_CLOCK.
0794        */
0795       T_rsc( ctx->status, RTEMS_INVALID_CLOCK );
0796       break;
0797     }
0798 
0799     case RtemsTimerReqServerFireWhen_Post_Status_IncStat: {
0800       /*
0801        * The return status of rtems_timer_server_fire_when() shall be
0802        * RTEMS_INCORRECT_STATE.
0803        */
0804       T_rsc( ctx->status, RTEMS_INCORRECT_STATE );
0805       break;
0806     }
0807 
0808     case RtemsTimerReqServerFireWhen_Post_Status_NA:
0809       break;
0810   }
0811 }
0812 
0813 static void RtemsTimerReqServerFireWhen_Post_Context_Check(
0814   RtemsTimerReqServerFireWhen_Context     *ctx,
0815   RtemsTimerReqServerFireWhen_Post_Context state
0816 )
0817 {
0818   Timer_Classes class;
0819   class = GetTimerClass( ctx->timer_id );
0820 
0821   switch ( state ) {
0822     case RtemsTimerReqServerFireWhen_Post_Context_None: {
0823       /*
0824        * The timer shall have never been scheduled. See also none.
0825        */
0826       T_eq_int( class, TIMER_DORMANT );
0827       break;
0828     }
0829 
0830     case RtemsTimerReqServerFireWhen_Post_Context_Interrupt: {
0831       /*
0832        * The timer shall be in interrupt context.
0833        */
0834       T_eq_int( class & TIMER_CLASS_BIT_ON_TASK, 0 );
0835       break;
0836     }
0837 
0838     case RtemsTimerReqServerFireWhen_Post_Context_Server: {
0839       /*
0840        * The timer shall be in server context.
0841        */
0842       T_eq_int( class & TIMER_CLASS_BIT_ON_TASK, TIMER_CLASS_BIT_ON_TASK );
0843       break;
0844     }
0845 
0846     case RtemsTimerReqServerFireWhen_Post_Context_Nop: {
0847       /*
0848        * Objects referenced by parameters in the past call to
0849        * rtems_timer_server_fire_when() shall not be accessed by the
0850        * rtems_timer_server_fire_when() call. See also Nop.
0851        */
0852       T_eq_int( class, ctx->pre_class );
0853       break;
0854     }
0855 
0856     case RtemsTimerReqServerFireWhen_Post_Context_NA:
0857       break;
0858   }
0859 }
0860 
0861 static void RtemsTimerReqServerFireWhen_Post_Clock_Check(
0862   RtemsTimerReqServerFireWhen_Context   *ctx,
0863   RtemsTimerReqServerFireWhen_Post_Clock state
0864 )
0865 {
0866   Timer_Classes class;
0867   class = GetTimerClass( ctx->timer_id );
0868 
0869   switch ( state ) {
0870     case RtemsTimerReqServerFireWhen_Post_Clock_None: {
0871       /*
0872        * The timer shall have never been scheduled.
0873        */
0874       T_eq_int( class, TIMER_DORMANT );
0875       break;
0876     }
0877 
0878     case RtemsTimerReqServerFireWhen_Post_Clock_Ticks: {
0879       /*
0880        * The timer shall use the ticks based clock.
0881        */
0882       T_eq_int( class & TIMER_CLASS_BIT_TIME_OF_DAY, 0 );
0883       break;
0884     }
0885 
0886     case RtemsTimerReqServerFireWhen_Post_Clock_Realtime: {
0887       /*
0888        * The timer shall use the realtime clock.
0889        */
0890       T_eq_int(
0891         class & TIMER_CLASS_BIT_TIME_OF_DAY,
0892         TIMER_CLASS_BIT_TIME_OF_DAY
0893       );
0894       break;
0895     }
0896 
0897     case RtemsTimerReqServerFireWhen_Post_Clock_Nop: {
0898       /*
0899        * Objects referenced by parameters in the past call to
0900        * rtems_timer_server_fire_when() shall not be accessed by the
0901        * rtems_timer_server_fire_when() call.
0902        */
0903       T_eq_int( class, ctx->pre_class );
0904       break;
0905     }
0906 
0907     case RtemsTimerReqServerFireWhen_Post_Clock_NA:
0908       break;
0909   }
0910 }
0911 
0912 static void RtemsTimerReqServerFireWhen_Post_State_Check(
0913   RtemsTimerReqServerFireWhen_Context   *ctx,
0914   RtemsTimerReqServerFireWhen_Post_State state
0915 )
0916 {
0917   switch ( state ) {
0918     case RtemsTimerReqServerFireWhen_Post_State_Scheduled: {
0919       /*
0920        * The timer shall be in scheduled state.
0921        */
0922       TriggerTimer( ctx, &ctx->tod_till_fire );
0923       T_eq_int( ctx->invocations, 1 );
0924       break;
0925     }
0926 
0927     case RtemsTimerReqServerFireWhen_Post_State_Nop: {
0928       /*
0929        * Objects referenced by parameters in the past call to
0930        * rtems_timer_server_fire_when() shall not be accessed by the
0931        * rtems_timer_server_fire_when() call.
0932        */
0933       T_eq_int( ctx->post_state, ctx->pre_state );
0934       break;
0935     }
0936 
0937     case RtemsTimerReqServerFireWhen_Post_State_NA:
0938       break;
0939   }
0940 }
0941 
0942 static void RtemsTimerReqServerFireWhen_Post_WallTime_Check(
0943   RtemsTimerReqServerFireWhen_Context      *ctx,
0944   RtemsTimerReqServerFireWhen_Post_WallTime state
0945 )
0946 {
0947   switch ( state ) {
0948     case RtemsTimerReqServerFireWhen_Post_WallTime_Param: {
0949       /*
0950        * The Timer Service Routine shall be invoked at the wall time (see
0951        * realtime clock) (ignoring ticks), which was provided by the
0952        * ``wall_time`` parameter in the past call to
0953        * rtems_timer_server_fire_when().
0954        */
0955       T_eq_mem(
0956         &ctx->tod_till_fire,
0957         ctx->wall_time_param,
0958         sizeof( ctx->tod_till_fire )
0959       );
0960       break;
0961     }
0962 
0963     case RtemsTimerReqServerFireWhen_Post_WallTime_Nop: {
0964       /*
0965        * If and when the Timer Service Routine will be invoked shall not be
0966        * changed by the past call to rtems_timer_server_fire_when().
0967        */
0968       /*
0969        * Whether the timer is scheduled has already been tested by the
0970        * "Nop" "State" post-condition above.
0971        */
0972       T_eq_u32(
0973         ctx->post_scheduling_data.interval,
0974         ctx->pre_scheduling_data.interval
0975       );
0976       break;
0977     }
0978 
0979     case RtemsTimerReqServerFireWhen_Post_WallTime_NA:
0980       break;
0981   }
0982 }
0983 
0984 static void RtemsTimerReqServerFireWhen_Post_Routine_Check(
0985   RtemsTimerReqServerFireWhen_Context     *ctx,
0986   RtemsTimerReqServerFireWhen_Post_Routine state
0987 )
0988 {
0989   switch ( state ) {
0990     case RtemsTimerReqServerFireWhen_Post_Routine_Param: {
0991       /*
0992        * The function reference used to invoke the Timer Service Routine when
0993        * the timer will fire shall be the one provided by the ``routine``
0994        * parameter in the past call to rtems_timer_server_fire_when().
0995        */
0996       T_eq_int( ctx->invocations, 1 );
0997       break;
0998     }
0999 
1000     case RtemsTimerReqServerFireWhen_Post_Routine_Nop: {
1001       /*
1002        * The function reference used for any invocation of the Timer Service
1003        * Routine shall not be changed by the past call to
1004        * rtems_timer_server_fire_when().
1005        */
1006       T_eq_ptr(
1007         ctx->post_scheduling_data.routine,
1008         ctx->pre_scheduling_data.routine
1009       );
1010       break;
1011     }
1012 
1013     case RtemsTimerReqServerFireWhen_Post_Routine_NA:
1014       break;
1015   }
1016 }
1017 
1018 static void RtemsTimerReqServerFireWhen_Post_UserData_Check(
1019   RtemsTimerReqServerFireWhen_Context      *ctx,
1020   RtemsTimerReqServerFireWhen_Post_UserData state
1021 )
1022 {
1023   switch ( state ) {
1024     case RtemsTimerReqServerFireWhen_Post_UserData_Param: {
1025       /*
1026        * The user data argument for invoking the Timer Service Routine when the
1027        * timer will fire shall be the one provided by the ``user_data``
1028        * parameter in the past call to rtems_timer_server_fire_when().
1029        */
1030       T_eq_ptr( ctx->routine_user_data, ctx );
1031       break;
1032     }
1033 
1034     case RtemsTimerReqServerFireWhen_Post_UserData_Nop: {
1035       /*
1036        * The user data argument used for any invocation of the Timer Service
1037        * Routine shall not be changed by the past call to
1038        * rtems_timer_server_fire_when().
1039        */
1040       T_eq_ptr(
1041         ctx->post_scheduling_data.user_data,
1042         ctx->pre_scheduling_data.user_data
1043       );
1044       break;
1045     }
1046 
1047     case RtemsTimerReqServerFireWhen_Post_UserData_NA:
1048       break;
1049   }
1050 }
1051 
1052 /**
1053  * @brief Make sure the realtime clock is not set after this test.
1054  */
1055 static void RtemsTimerReqServerFireWhen_Teardown(
1056   RtemsTimerReqServerFireWhen_Context *ctx
1057 )
1058 {
1059   UnsetClock();
1060 }
1061 
1062 static void RtemsTimerReqServerFireWhen_Teardown_Wrap( void *arg )
1063 {
1064   RtemsTimerReqServerFireWhen_Context *ctx;
1065 
1066   ctx = arg;
1067   ctx->Map.in_action_loop = false;
1068   RtemsTimerReqServerFireWhen_Teardown( ctx );
1069 }
1070 
1071 static void RtemsTimerReqServerFireWhen_Prepare(
1072   RtemsTimerReqServerFireWhen_Context *ctx
1073 )
1074 {
1075   rtems_status_code status;
1076   status = rtems_timer_create(
1077     rtems_build_name( 'T', 'I', 'M', 'E' ),
1078     &ctx->timer_id
1079   );
1080   T_rsc_success( status );
1081 
1082   ctx->invocations       = 0;
1083   ctx->routine_user_data = NULL;
1084 }
1085 
1086 static void RtemsTimerReqServerFireWhen_Action(
1087   RtemsTimerReqServerFireWhen_Context *ctx
1088 )
1089 {
1090   GetTimerSchedulingData( ctx->timer_id, &ctx->pre_scheduling_data );
1091   ctx->pre_class = GetTimerClass( ctx->timer_id );
1092   if ( ctx->pre_cond_tod == NULL ) {
1093     UnsetClock();
1094   } else {
1095     T_rsc_success( rtems_clock_set( ctx->pre_cond_tod ) );
1096   }
1097   ctx->status = rtems_timer_server_fire_when(
1098     ctx->id_param,
1099     ctx->wall_time_param,
1100     ctx->routine_param,
1101     ctx
1102   );
1103   ctx->post_state = GetTimerState( ctx->timer_id );
1104   GetTimerSchedulingData( ctx->timer_id, &ctx->post_scheduling_data );
1105   /* Ignoring return status: the timer server task may be suspended or not. */
1106   rtems_task_resume( GetTimerServerTaskId() );
1107 }
1108 
1109 static void RtemsTimerReqServerFireWhen_Cleanup(
1110   RtemsTimerReqServerFireWhen_Context *ctx
1111 )
1112 {
1113   T_rsc_success( rtems_timer_delete( ctx->timer_id ) );
1114   DeleteTimerServer();
1115 }
1116 
1117 static const RtemsTimerReqServerFireWhen_Entry
1118 RtemsTimerReqServerFireWhen_Entries[] = {
1119   { 1, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NA,
1120     RtemsTimerReqServerFireWhen_Post_Context_NA,
1121     RtemsTimerReqServerFireWhen_Post_Clock_NA,
1122     RtemsTimerReqServerFireWhen_Post_State_NA,
1123     RtemsTimerReqServerFireWhen_Post_WallTime_NA,
1124     RtemsTimerReqServerFireWhen_Post_Routine_NA,
1125     RtemsTimerReqServerFireWhen_Post_UserData_NA },
1126   { 1, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NA,
1127     RtemsTimerReqServerFireWhen_Post_Context_NA,
1128     RtemsTimerReqServerFireWhen_Post_Clock_NA,
1129     RtemsTimerReqServerFireWhen_Post_State_NA,
1130     RtemsTimerReqServerFireWhen_Post_WallTime_NA,
1131     RtemsTimerReqServerFireWhen_Post_Routine_NA,
1132     RtemsTimerReqServerFireWhen_Post_UserData_NA },
1133   { 1, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NA,
1134     RtemsTimerReqServerFireWhen_Post_Context_NA,
1135     RtemsTimerReqServerFireWhen_Post_Clock_NA,
1136     RtemsTimerReqServerFireWhen_Post_State_NA,
1137     RtemsTimerReqServerFireWhen_Post_WallTime_NA,
1138     RtemsTimerReqServerFireWhen_Post_Routine_NA,
1139     RtemsTimerReqServerFireWhen_Post_UserData_NA },
1140   { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_IncStat,
1141     RtemsTimerReqServerFireWhen_Post_Context_Nop,
1142     RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1143     RtemsTimerReqServerFireWhen_Post_State_Nop,
1144     RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1145     RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1146     RtemsTimerReqServerFireWhen_Post_UserData_Nop },
1147   { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_InvAddr,
1148     RtemsTimerReqServerFireWhen_Post_Context_Nop,
1149     RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1150     RtemsTimerReqServerFireWhen_Post_State_Nop,
1151     RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1152     RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1153     RtemsTimerReqServerFireWhen_Post_UserData_Nop },
1154   { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NotDef,
1155     RtemsTimerReqServerFireWhen_Post_Context_Nop,
1156     RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1157     RtemsTimerReqServerFireWhen_Post_State_Nop,
1158     RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1159     RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1160     RtemsTimerReqServerFireWhen_Post_UserData_Nop },
1161   { 0, 0, 0, 0, 0, 0, 0, 0, 0,
1162     RtemsTimerReqServerFireWhen_Post_Status_InvClock,
1163     RtemsTimerReqServerFireWhen_Post_Context_Nop,
1164     RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1165     RtemsTimerReqServerFireWhen_Post_State_Nop,
1166     RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1167     RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1168     RtemsTimerReqServerFireWhen_Post_UserData_Nop },
1169   { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_Ok,
1170     RtemsTimerReqServerFireWhen_Post_Context_Server,
1171     RtemsTimerReqServerFireWhen_Post_Clock_Realtime,
1172     RtemsTimerReqServerFireWhen_Post_State_Scheduled,
1173     RtemsTimerReqServerFireWhen_Post_WallTime_Param,
1174     RtemsTimerReqServerFireWhen_Post_Routine_Param,
1175     RtemsTimerReqServerFireWhen_Post_UserData_Param },
1176   { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_InvId,
1177     RtemsTimerReqServerFireWhen_Post_Context_Nop,
1178     RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1179     RtemsTimerReqServerFireWhen_Post_State_Nop,
1180     RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1181     RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1182     RtemsTimerReqServerFireWhen_Post_UserData_Nop }
1183 };
1184 
1185 static const uint8_t
1186 RtemsTimerReqServerFireWhen_Map[] = {
1187   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,
1188   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,
1189   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,
1190   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,
1191   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,
1192   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,
1193   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,
1194   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,
1195   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,
1196   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,
1197   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,
1198   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,
1199   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,
1200   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,
1201   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,
1202   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,
1203   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,
1204   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,
1205   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,
1206   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,
1207   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,
1208   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,
1209   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,
1210   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,
1211   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,
1212   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,
1213   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,
1214   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,
1215   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,
1216   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,
1217   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,
1218   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,
1219   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,
1220   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,
1221   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,
1222   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,
1223   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,
1224   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,
1225   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,
1226   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,
1227   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,
1228   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,
1229   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,
1230   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,
1231   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,
1232   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,
1233   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,
1234   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,
1235   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,
1236   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,
1237   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,
1238   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,
1239   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,
1240   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,
1241   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,
1242   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,
1243   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,
1244   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,
1245   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,
1246   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,
1247   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,
1248   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,
1249   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,
1250   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,
1251   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,
1252   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,
1253   2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1
1254 };
1255 
1256 static size_t RtemsTimerReqServerFireWhen_Scope(
1257   void  *arg,
1258   char  *buf,
1259   size_t n
1260 )
1261 {
1262   RtemsTimerReqServerFireWhen_Context *ctx;
1263 
1264   ctx = arg;
1265 
1266   if ( ctx->Map.in_action_loop ) {
1267     return T_get_scope(
1268       RtemsTimerReqServerFireWhen_PreDesc,
1269       buf,
1270       n,
1271       ctx->Map.pcs
1272     );
1273   }
1274 
1275   return 0;
1276 }
1277 
1278 static T_fixture RtemsTimerReqServerFireWhen_Fixture = {
1279   .setup = NULL,
1280   .stop = NULL,
1281   .teardown = RtemsTimerReqServerFireWhen_Teardown_Wrap,
1282   .scope = RtemsTimerReqServerFireWhen_Scope,
1283   .initial_context = &RtemsTimerReqServerFireWhen_Instance
1284 };
1285 
1286 static inline RtemsTimerReqServerFireWhen_Entry
1287 RtemsTimerReqServerFireWhen_PopEntry(
1288   RtemsTimerReqServerFireWhen_Context *ctx
1289 )
1290 {
1291   size_t index;
1292 
1293   index = ctx->Map.index;
1294   ctx->Map.index = index + 1;
1295   return RtemsTimerReqServerFireWhen_Entries[
1296     RtemsTimerReqServerFireWhen_Map[ index ]
1297   ];
1298 }
1299 
1300 static void RtemsTimerReqServerFireWhen_TestVariant(
1301   RtemsTimerReqServerFireWhen_Context *ctx
1302 )
1303 {
1304   RtemsTimerReqServerFireWhen_Pre_Server_Prepare( ctx, ctx->Map.pcs[ 0 ] );
1305   RtemsTimerReqServerFireWhen_Pre_RtClock_Prepare( ctx, ctx->Map.pcs[ 1 ] );
1306   RtemsTimerReqServerFireWhen_Pre_Routine_Prepare( ctx, ctx->Map.pcs[ 2 ] );
1307   RtemsTimerReqServerFireWhen_Pre_WallTime_Prepare( ctx, ctx->Map.pcs[ 3 ] );
1308   RtemsTimerReqServerFireWhen_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 4 ] );
1309   RtemsTimerReqServerFireWhen_Pre_Context_Prepare( ctx, ctx->Map.pcs[ 5 ] );
1310   RtemsTimerReqServerFireWhen_Pre_Clock_Prepare( ctx, ctx->Map.pcs[ 6 ] );
1311   RtemsTimerReqServerFireWhen_Pre_State_Prepare( ctx, ctx->Map.pcs[ 7 ] );
1312   RtemsTimerReqServerFireWhen_Action( ctx );
1313   RtemsTimerReqServerFireWhen_Post_Status_Check(
1314     ctx,
1315     ctx->Map.entry.Post_Status
1316   );
1317   RtemsTimerReqServerFireWhen_Post_Context_Check(
1318     ctx,
1319     ctx->Map.entry.Post_Context
1320   );
1321   RtemsTimerReqServerFireWhen_Post_Clock_Check(
1322     ctx,
1323     ctx->Map.entry.Post_Clock
1324   );
1325   RtemsTimerReqServerFireWhen_Post_State_Check(
1326     ctx,
1327     ctx->Map.entry.Post_State
1328   );
1329   RtemsTimerReqServerFireWhen_Post_WallTime_Check(
1330     ctx,
1331     ctx->Map.entry.Post_WallTime
1332   );
1333   RtemsTimerReqServerFireWhen_Post_Routine_Check(
1334     ctx,
1335     ctx->Map.entry.Post_Routine
1336   );
1337   RtemsTimerReqServerFireWhen_Post_UserData_Check(
1338     ctx,
1339     ctx->Map.entry.Post_UserData
1340   );
1341 }
1342 
1343 /**
1344  * @fn void T_case_body_RtemsTimerReqServerFireWhen( void )
1345  */
1346 T_TEST_CASE_FIXTURE(
1347   RtemsTimerReqServerFireWhen,
1348   &RtemsTimerReqServerFireWhen_Fixture
1349 )
1350 {
1351   RtemsTimerReqServerFireWhen_Context *ctx;
1352 
1353   ctx = T_fixture_context();
1354   ctx->Map.in_action_loop = true;
1355   ctx->Map.index = 0;
1356 
1357   for (
1358     ctx->Map.pcs[ 0 ] = RtemsTimerReqServerFireWhen_Pre_Server_Init;
1359     ctx->Map.pcs[ 0 ] < RtemsTimerReqServerFireWhen_Pre_Server_NA;
1360     ++ctx->Map.pcs[ 0 ]
1361   ) {
1362     for (
1363       ctx->Map.pcs[ 1 ] = RtemsTimerReqServerFireWhen_Pre_RtClock_Set;
1364       ctx->Map.pcs[ 1 ] < RtemsTimerReqServerFireWhen_Pre_RtClock_NA;
1365       ++ctx->Map.pcs[ 1 ]
1366     ) {
1367       for (
1368         ctx->Map.pcs[ 2 ] = RtemsTimerReqServerFireWhen_Pre_Routine_Valid;
1369         ctx->Map.pcs[ 2 ] < RtemsTimerReqServerFireWhen_Pre_Routine_NA;
1370         ++ctx->Map.pcs[ 2 ]
1371       ) {
1372         for (
1373           ctx->Map.pcs[ 3 ] = RtemsTimerReqServerFireWhen_Pre_WallTime_Valid;
1374           ctx->Map.pcs[ 3 ] < RtemsTimerReqServerFireWhen_Pre_WallTime_NA;
1375           ++ctx->Map.pcs[ 3 ]
1376         ) {
1377           for (
1378             ctx->Map.pcs[ 4 ] = RtemsTimerReqServerFireWhen_Pre_Id_Valid;
1379             ctx->Map.pcs[ 4 ] < RtemsTimerReqServerFireWhen_Pre_Id_NA;
1380             ++ctx->Map.pcs[ 4 ]
1381           ) {
1382             for (
1383               ctx->Map.pcs[ 5 ] = RtemsTimerReqServerFireWhen_Pre_Context_None;
1384               ctx->Map.pcs[ 5 ] < RtemsTimerReqServerFireWhen_Pre_Context_NA;
1385               ++ctx->Map.pcs[ 5 ]
1386             ) {
1387               for (
1388                 ctx->Map.pcs[ 6 ] = RtemsTimerReqServerFireWhen_Pre_Clock_None;
1389                 ctx->Map.pcs[ 6 ] < RtemsTimerReqServerFireWhen_Pre_Clock_NA;
1390                 ++ctx->Map.pcs[ 6 ]
1391               ) {
1392                 for (
1393                   ctx->Map.pcs[ 7 ] = RtemsTimerReqServerFireWhen_Pre_State_Inactive;
1394                   ctx->Map.pcs[ 7 ] < RtemsTimerReqServerFireWhen_Pre_State_NA;
1395                   ++ctx->Map.pcs[ 7 ]
1396                 ) {
1397                   ctx->Map.entry = RtemsTimerReqServerFireWhen_PopEntry( ctx );
1398 
1399                   if ( ctx->Map.entry.Skip ) {
1400                     continue;
1401                   }
1402 
1403                   RtemsTimerReqServerFireWhen_Prepare( ctx );
1404                   RtemsTimerReqServerFireWhen_TestVariant( ctx );
1405                   RtemsTimerReqServerFireWhen_Cleanup( ctx );
1406                 }
1407               }
1408             }
1409           }
1410         }
1411       }
1412     }
1413   }
1414 }
1415 
1416 /** @} */