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 RtemsTimerReqInitiateServer
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 #include <rtems/rtems/timerimpl.h>
0057 
0058 #include "tx-support.h"
0059 
0060 #include <rtems/test.h>
0061 
0062 /**
0063  * @defgroup RtemsTimerReqInitiateServer spec:/rtems/timer/req/initiate-server
0064  *
0065  * @ingroup TestsuitesValidationNoClock0
0066  *
0067  * @{
0068  */
0069 
0070 typedef enum {
0071   RtemsTimerReqInitiateServer_Pre_Priority_Valid,
0072   RtemsTimerReqInitiateServer_Pre_Priority_Default,
0073   RtemsTimerReqInitiateServer_Pre_Priority_Invalid,
0074   RtemsTimerReqInitiateServer_Pre_Priority_NA
0075 } RtemsTimerReqInitiateServer_Pre_Priority;
0076 
0077 typedef enum {
0078   RtemsTimerReqInitiateServer_Pre_Stack_Allocatable,
0079   RtemsTimerReqInitiateServer_Pre_Stack_TooLarge,
0080   RtemsTimerReqInitiateServer_Pre_Stack_NA
0081 } RtemsTimerReqInitiateServer_Pre_Stack;
0082 
0083 typedef enum {
0084   RtemsTimerReqInitiateServer_Pre_Started_Yes,
0085   RtemsTimerReqInitiateServer_Pre_Started_No,
0086   RtemsTimerReqInitiateServer_Pre_Started_NA
0087 } RtemsTimerReqInitiateServer_Pre_Started;
0088 
0089 typedef enum {
0090   RtemsTimerReqInitiateServer_Pre_TaskObj_Available,
0091   RtemsTimerReqInitiateServer_Pre_TaskObj_Unavailable,
0092   RtemsTimerReqInitiateServer_Pre_TaskObj_NA
0093 } RtemsTimerReqInitiateServer_Pre_TaskObj;
0094 
0095 typedef enum {
0096   RtemsTimerReqInitiateServer_Post_Status_Ok,
0097   RtemsTimerReqInitiateServer_Post_Status_IncStat,
0098   RtemsTimerReqInitiateServer_Post_Status_InvPrio,
0099   RtemsTimerReqInitiateServer_Post_Status_TooMany,
0100   RtemsTimerReqInitiateServer_Post_Status_Unsat,
0101   RtemsTimerReqInitiateServer_Post_Status_NA
0102 } RtemsTimerReqInitiateServer_Post_Status;
0103 
0104 typedef enum {
0105   RtemsTimerReqInitiateServer_Post_Started_Yes,
0106   RtemsTimerReqInitiateServer_Post_Started_No,
0107   RtemsTimerReqInitiateServer_Post_Started_NA
0108 } RtemsTimerReqInitiateServer_Post_Started;
0109 
0110 typedef enum {
0111   RtemsTimerReqInitiateServer_Post_TaskPrio_Set,
0112   RtemsTimerReqInitiateServer_Post_TaskPrio_Nop,
0113   RtemsTimerReqInitiateServer_Post_TaskPrio_NA
0114 } RtemsTimerReqInitiateServer_Post_TaskPrio;
0115 
0116 typedef enum {
0117   RtemsTimerReqInitiateServer_Post_TaskStack_Set,
0118   RtemsTimerReqInitiateServer_Post_TaskStack_Nop,
0119   RtemsTimerReqInitiateServer_Post_TaskStack_NA
0120 } RtemsTimerReqInitiateServer_Post_TaskStack;
0121 
0122 typedef enum {
0123   RtemsTimerReqInitiateServer_Post_TaskAttr_Set,
0124   RtemsTimerReqInitiateServer_Post_TaskAttr_Nop,
0125   RtemsTimerReqInitiateServer_Post_TaskAttr_NA
0126 } RtemsTimerReqInitiateServer_Post_TaskAttr;
0127 
0128 typedef struct {
0129   uint16_t Skip : 1;
0130   uint16_t Pre_Priority_NA : 1;
0131   uint16_t Pre_Stack_NA : 1;
0132   uint16_t Pre_Started_NA : 1;
0133   uint16_t Pre_TaskObj_NA : 1;
0134   uint16_t Post_Status : 3;
0135   uint16_t Post_Started : 2;
0136   uint16_t Post_TaskPrio : 2;
0137   uint16_t Post_TaskStack : 2;
0138   uint16_t Post_TaskAttr : 2;
0139 } RtemsTimerReqInitiateServer_Entry;
0140 
0141 /**
0142  * @brief Test context for spec:/rtems/timer/req/initiate-server test case.
0143  */
0144 typedef struct {
0145   /**
0146    * @brief If the Timer Server task exists before the action, its priority
0147    *   before the action.
0148    */
0149   rtems_task_priority before_priority;
0150 
0151   /**
0152    * @brief If the Timer Server task exists before the action, its stack size
0153    *   before the action.
0154    */
0155   size_t before_stack_size;
0156 
0157   /**
0158    * @brief If the Timer Server task exists before the action, whether the
0159    *   floating point attribute is set before the action.
0160    */
0161   bool before_has_floating_point;
0162 
0163   /**
0164    * @brief The ``priority`` parameter for the action.
0165    */
0166   rtems_task_priority priority;
0167 
0168   /**
0169    * @brief The ``stack_size`` parameter for the action.
0170    */
0171   size_t stack_size;
0172 
0173   /**
0174    * @brief The status value returned by the action
0175    *   rtems_timer_initiate_server().
0176    */
0177   rtems_status_code status;
0178 
0179   /**
0180    * @brief This member is used by the T_seize_objects() and
0181    *   T_surrender_objects() support functions.
0182    */
0183   void *task_objects;
0184 
0185   struct {
0186     /**
0187      * @brief This member defines the pre-condition states for the next action.
0188      */
0189     size_t pcs[ 4 ];
0190 
0191     /**
0192      * @brief If this member is true, then the test action loop is executed.
0193      */
0194     bool in_action_loop;
0195 
0196     /**
0197      * @brief This member contains the next transition map index.
0198      */
0199     size_t index;
0200 
0201     /**
0202      * @brief This member contains the current transition map entry.
0203      */
0204     RtemsTimerReqInitiateServer_Entry entry;
0205 
0206     /**
0207      * @brief If this member is true, then the current transition variant
0208      *   should be skipped.
0209      */
0210     bool skip;
0211   } Map;
0212 } RtemsTimerReqInitiateServer_Context;
0213 
0214 static RtemsTimerReqInitiateServer_Context
0215   RtemsTimerReqInitiateServer_Instance;
0216 
0217 static const char * const RtemsTimerReqInitiateServer_PreDesc_Priority[] = {
0218   "Valid",
0219   "Default",
0220   "Invalid",
0221   "NA"
0222 };
0223 
0224 static const char * const RtemsTimerReqInitiateServer_PreDesc_Stack[] = {
0225   "Allocatable",
0226   "TooLarge",
0227   "NA"
0228 };
0229 
0230 static const char * const RtemsTimerReqInitiateServer_PreDesc_Started[] = {
0231   "Yes",
0232   "No",
0233   "NA"
0234 };
0235 
0236 static const char * const RtemsTimerReqInitiateServer_PreDesc_TaskObj[] = {
0237   "Available",
0238   "Unavailable",
0239   "NA"
0240 };
0241 
0242 static const char * const * const RtemsTimerReqInitiateServer_PreDesc[] = {
0243   RtemsTimerReqInitiateServer_PreDesc_Priority,
0244   RtemsTimerReqInitiateServer_PreDesc_Stack,
0245   RtemsTimerReqInitiateServer_PreDesc_Started,
0246   RtemsTimerReqInitiateServer_PreDesc_TaskObj,
0247   NULL
0248 };
0249 
0250 static bool ExistTimerServer( void )
0251 {
0252   return GetTimerServerTaskId() != RTEMS_INVALID_ID;
0253 }
0254 
0255 static rtems_task_priority GetTimerServerPriority( void )
0256 {
0257   return GetPriority( GetTimerServerTaskId() );
0258 }
0259 
0260 static size_t GetTimerServerStackSize( void )
0261 {
0262   rtems_tcb *tcb;
0263   rtems_id server_task_id;
0264   server_task_id = GetTimerServerTaskId();
0265   T_ne_u32( server_task_id, RTEMS_INVALID_ID );
0266   tcb = GetThread( server_task_id );
0267   T_not_null( tcb );
0268   return tcb->Start.Initial_stack.size;
0269 }
0270 
0271 static bool HasTimerServerFloatingPoint( void )
0272 {
0273   rtems_tcb *tcb;
0274   rtems_id server_task_id;
0275   server_task_id = GetTimerServerTaskId();
0276   T_ne_u32( server_task_id, RTEMS_INVALID_ID );
0277   tcb = GetThread( server_task_id );
0278   T_not_null( tcb );
0279   return tcb->is_fp;
0280 }
0281 
0282 static rtems_status_code AllocateTaskObject( void *arg, rtems_id *task_id )
0283 {
0284   (void) arg;
0285 
0286   return rtems_task_create(
0287     rtems_build_name( 'T', 'A', ' ', 'N' ),
0288     PRIO_LOW,
0289     RTEMS_MINIMUM_STACK_SIZE,
0290     RTEMS_DEFAULT_MODES,
0291     RTEMS_DEFAULT_ATTRIBUTES,
0292     task_id
0293   );
0294 }
0295 
0296 static void RtemsTimerReqInitiateServer_Pre_Priority_Prepare(
0297   RtemsTimerReqInitiateServer_Context     *ctx,
0298   RtemsTimerReqInitiateServer_Pre_Priority state
0299 )
0300 {
0301   switch ( state ) {
0302     case RtemsTimerReqInitiateServer_Pre_Priority_Valid: {
0303       /*
0304        * While the ``priority`` parameter is valid.
0305        */
0306       ctx->priority = 13;
0307       break;
0308     }
0309 
0310     case RtemsTimerReqInitiateServer_Pre_Priority_Default: {
0311       /*
0312        * While the ``priority`` parameter is equal to
0313        * RTEMS_TIMER_SERVER_DEFAULT_PRIORITY.
0314        */
0315       ctx->priority = RTEMS_TIMER_SERVER_DEFAULT_PRIORITY;
0316       break;
0317     }
0318 
0319     case RtemsTimerReqInitiateServer_Pre_Priority_Invalid: {
0320       /*
0321        * While the ``priority`` parameter is invalid.
0322        */
0323       ctx->priority = PRIO_INVALID;
0324       break;
0325     }
0326 
0327     case RtemsTimerReqInitiateServer_Pre_Priority_NA:
0328       break;
0329   }
0330 }
0331 
0332 static void RtemsTimerReqInitiateServer_Pre_Stack_Prepare(
0333   RtemsTimerReqInitiateServer_Context  *ctx,
0334   RtemsTimerReqInitiateServer_Pre_Stack state
0335 )
0336 {
0337   switch ( state ) {
0338     case RtemsTimerReqInitiateServer_Pre_Stack_Allocatable: {
0339       /*
0340        * While the ``stack_size`` parameter specifies a task stack size which
0341        * is allocatable by the system.
0342        */
0343       ctx->stack_size = RTEMS_MINIMUM_STACK_SIZE;
0344       break;
0345     }
0346 
0347     case RtemsTimerReqInitiateServer_Pre_Stack_TooLarge: {
0348       /*
0349        * While the ``stack_size`` parameter specifies a task stack size which
0350        * is not allocatable by the system.
0351        */
0352       ctx->stack_size = SIZE_MAX;
0353       break;
0354     }
0355 
0356     case RtemsTimerReqInitiateServer_Pre_Stack_NA:
0357       break;
0358   }
0359 }
0360 
0361 static void RtemsTimerReqInitiateServer_Pre_Started_Prepare(
0362   RtemsTimerReqInitiateServer_Context    *ctx,
0363   RtemsTimerReqInitiateServer_Pre_Started state
0364 )
0365 {
0366   switch ( state ) {
0367     case RtemsTimerReqInitiateServer_Pre_Started_Yes: {
0368       /*
0369        * While the Timer Server task is started.
0370        */
0371       rtems_status_code status;
0372 
0373       if ( !ExistTimerServer() ) {
0374         status = rtems_timer_initiate_server(
0375           RTEMS_TIMER_SERVER_DEFAULT_PRIORITY,
0376           RTEMS_MINIMUM_STACK_SIZE,
0377           RTEMS_DEFAULT_ATTRIBUTES
0378         );
0379         T_rsc_success( status );
0380       }
0381       break;
0382     }
0383 
0384     case RtemsTimerReqInitiateServer_Pre_Started_No: {
0385       /*
0386        * While the Timer Server task is not started.
0387        */
0388       DeleteTimerServer();
0389       break;
0390     }
0391 
0392     case RtemsTimerReqInitiateServer_Pre_Started_NA:
0393       break;
0394   }
0395 }
0396 
0397 static void RtemsTimerReqInitiateServer_Pre_TaskObj_Prepare(
0398   RtemsTimerReqInitiateServer_Context    *ctx,
0399   RtemsTimerReqInitiateServer_Pre_TaskObj state
0400 )
0401 {
0402   switch ( state ) {
0403     case RtemsTimerReqInitiateServer_Pre_TaskObj_Available: {
0404       /*
0405        * While the system has at least one inactive task object available.
0406        */
0407       /* The test clean up ensures that all tasks objects are free. */
0408       break;
0409     }
0410 
0411     case RtemsTimerReqInitiateServer_Pre_TaskObj_Unavailable: {
0412       /*
0413        * While the system has no inactive task object available.
0414        */
0415       ctx->task_objects = T_seize_objects(
0416         AllocateTaskObject,
0417         NULL
0418       );
0419       break;
0420     }
0421 
0422     case RtemsTimerReqInitiateServer_Pre_TaskObj_NA:
0423       break;
0424   }
0425 }
0426 
0427 static void RtemsTimerReqInitiateServer_Post_Status_Check(
0428   RtemsTimerReqInitiateServer_Context    *ctx,
0429   RtemsTimerReqInitiateServer_Post_Status state
0430 )
0431 {
0432   switch ( state ) {
0433     case RtemsTimerReqInitiateServer_Post_Status_Ok: {
0434       /*
0435        * The return status of rtems_timer_initiate_server() shall be
0436        * RTEMS_SUCCESSFUL.
0437        */
0438       T_rsc_success( ctx->status );
0439       break;
0440     }
0441 
0442     case RtemsTimerReqInitiateServer_Post_Status_IncStat: {
0443       /*
0444        * The return status of rtems_timer_initiate_server() shall be
0445        * RTEMS_INCORRECT_STATE
0446        */
0447       T_rsc( ctx->status, RTEMS_INCORRECT_STATE );
0448       break;
0449     }
0450 
0451     case RtemsTimerReqInitiateServer_Post_Status_InvPrio: {
0452       /*
0453        * The return status of rtems_timer_initiate_server() shall be
0454        * RTEMS_INVALID_PRIORITY.
0455        */
0456       T_rsc( ctx->status, RTEMS_INVALID_PRIORITY );
0457       break;
0458     }
0459 
0460     case RtemsTimerReqInitiateServer_Post_Status_TooMany: {
0461       /*
0462        * The return status of rtems_timer_initiate_server() shall be
0463        * RTEMS_TOO_MANY.
0464        */
0465       T_rsc( ctx->status, RTEMS_TOO_MANY );
0466       break;
0467     }
0468 
0469     case RtemsTimerReqInitiateServer_Post_Status_Unsat: {
0470       /*
0471        * The return status of rtems_timer_initiate_server() shall be
0472        * RTEMS_UNSATISFIED.
0473        */
0474       T_rsc( ctx->status, RTEMS_UNSATISFIED  );
0475       break;
0476     }
0477 
0478     case RtemsTimerReqInitiateServer_Post_Status_NA:
0479       break;
0480   }
0481 }
0482 
0483 static void RtemsTimerReqInitiateServer_Post_Started_Check(
0484   RtemsTimerReqInitiateServer_Context     *ctx,
0485   RtemsTimerReqInitiateServer_Post_Started state
0486 )
0487 {
0488   switch ( state ) {
0489     case RtemsTimerReqInitiateServer_Post_Started_Yes: {
0490       /*
0491        * The Timer Server task shall be started after the
0492        * rtems_timer_initiate_server() call.
0493        */
0494       T_true( ExistTimerServer() );
0495       break;
0496     }
0497 
0498     case RtemsTimerReqInitiateServer_Post_Started_No: {
0499       /*
0500        * The Timer Server task shall not be started after the
0501        * rtems_timer_initiate_server() call.
0502        */
0503       T_false( ExistTimerServer() );
0504       break;
0505     }
0506 
0507     case RtemsTimerReqInitiateServer_Post_Started_NA:
0508       break;
0509   }
0510 }
0511 
0512 static void RtemsTimerReqInitiateServer_Post_TaskPrio_Check(
0513   RtemsTimerReqInitiateServer_Context      *ctx,
0514   RtemsTimerReqInitiateServer_Post_TaskPrio state
0515 )
0516 {
0517   switch ( state ) {
0518     case RtemsTimerReqInitiateServer_Post_TaskPrio_Set: {
0519       /*
0520        * The priority of the Timer Server task shall be equal to the priority
0521        * specified by the ``priority`` parameter in the
0522        * rtems_timer_initiate_server() call.
0523        */
0524       if ( ctx->priority == RTEMS_TIMER_SERVER_DEFAULT_PRIORITY ) {
0525         T_eq_u32( GetTimerServerPriority(), 0 );
0526       } else {
0527         T_eq_u32( GetTimerServerPriority(), ctx->priority );
0528       }
0529       break;
0530     }
0531 
0532     case RtemsTimerReqInitiateServer_Post_TaskPrio_Nop: {
0533       /*
0534        * The priority of the Timer Server task shall not be modified by the
0535        * rtems_timer_initiate_server() call.
0536        */
0537       T_eq_u32( GetTimerServerPriority(), ctx->before_priority );
0538       break;
0539     }
0540 
0541     case RtemsTimerReqInitiateServer_Post_TaskPrio_NA:
0542       break;
0543   }
0544 }
0545 
0546 static void RtemsTimerReqInitiateServer_Post_TaskStack_Check(
0547   RtemsTimerReqInitiateServer_Context       *ctx,
0548   RtemsTimerReqInitiateServer_Post_TaskStack state
0549 )
0550 {
0551   switch ( state ) {
0552     case RtemsTimerReqInitiateServer_Post_TaskStack_Set: {
0553       /*
0554        * The stack size of the Timer Server task shall be greater than or equal
0555        * to the stack size specified by the ``stack_size`` parameter in the
0556        * rtems_timer_initiate_server() call.
0557        */
0558       T_ge_sz( GetTimerServerStackSize(), ctx->stack_size );
0559       break;
0560     }
0561 
0562     case RtemsTimerReqInitiateServer_Post_TaskStack_Nop: {
0563       /*
0564        * The stack size of the Timer Server task shall not be modified by the
0565        * rtems_timer_initiate_server() call.
0566        */
0567       T_ge_sz( GetTimerServerStackSize(), ctx->before_stack_size );
0568       break;
0569     }
0570 
0571     case RtemsTimerReqInitiateServer_Post_TaskStack_NA:
0572       break;
0573   }
0574 }
0575 
0576 static void RtemsTimerReqInitiateServer_Post_TaskAttr_Check(
0577   RtemsTimerReqInitiateServer_Context      *ctx,
0578   RtemsTimerReqInitiateServer_Post_TaskAttr state
0579 )
0580 {
0581   switch ( state ) {
0582     case RtemsTimerReqInitiateServer_Post_TaskAttr_Set: {
0583       /*
0584        * The task attributes of the Timer Server task shall be specified by the
0585        * ``attribute_set`` parameter in the rtems_timer_initiate_server() call.
0586        */
0587       T_true( HasTimerServerFloatingPoint() );
0588       break;
0589     }
0590 
0591     case RtemsTimerReqInitiateServer_Post_TaskAttr_Nop: {
0592       /*
0593        * The task attributes of the Timer Server task shall not be modified by
0594        * the rtems_timer_initiate_server() call.
0595        */
0596       T_true( HasTimerServerFloatingPoint() == ctx->before_has_floating_point );
0597       break;
0598     }
0599 
0600     case RtemsTimerReqInitiateServer_Post_TaskAttr_NA:
0601       break;
0602   }
0603 }
0604 
0605 static void RtemsTimerReqInitiateServer_Setup(
0606   RtemsTimerReqInitiateServer_Context *ctx
0607 )
0608 {
0609   ctx->task_objects = NULL;
0610 }
0611 
0612 static void RtemsTimerReqInitiateServer_Setup_Wrap( void *arg )
0613 {
0614   RtemsTimerReqInitiateServer_Context *ctx;
0615 
0616   ctx = arg;
0617   ctx->Map.in_action_loop = false;
0618   RtemsTimerReqInitiateServer_Setup( ctx );
0619 }
0620 
0621 /**
0622  * @brief Make sure the time server in not running after this test.
0623  */
0624 static void RtemsTimerReqInitiateServer_Teardown(
0625   RtemsTimerReqInitiateServer_Context *ctx
0626 )
0627 {
0628   DeleteTimerServer();
0629 }
0630 
0631 static void RtemsTimerReqInitiateServer_Teardown_Wrap( void *arg )
0632 {
0633   RtemsTimerReqInitiateServer_Context *ctx;
0634 
0635   ctx = arg;
0636   ctx->Map.in_action_loop = false;
0637   RtemsTimerReqInitiateServer_Teardown( ctx );
0638 }
0639 
0640 static void RtemsTimerReqInitiateServer_Action(
0641   RtemsTimerReqInitiateServer_Context *ctx
0642 )
0643 {
0644   if ( ExistTimerServer() ) {
0645     ctx->before_priority = GetTimerServerPriority();
0646     ctx->before_stack_size = GetTimerServerStackSize();
0647     ctx->before_has_floating_point = HasTimerServerFloatingPoint();
0648   }
0649 
0650   ctx->status = rtems_timer_initiate_server(
0651     ctx->priority,
0652     ctx->stack_size,
0653     RTEMS_FLOATING_POINT
0654   );
0655 }
0656 
0657 static void RtemsTimerReqInitiateServer_Cleanup(
0658   RtemsTimerReqInitiateServer_Context *ctx
0659 )
0660 {
0661   T_surrender_objects( &ctx->task_objects, rtems_task_delete );
0662 }
0663 
0664 static const RtemsTimerReqInitiateServer_Entry
0665 RtemsTimerReqInitiateServer_Entries[] = {
0666   { 0, 0, 0, 0, 0, RtemsTimerReqInitiateServer_Post_Status_IncStat,
0667     RtemsTimerReqInitiateServer_Post_Started_Yes,
0668     RtemsTimerReqInitiateServer_Post_TaskPrio_Nop,
0669     RtemsTimerReqInitiateServer_Post_TaskStack_Nop,
0670     RtemsTimerReqInitiateServer_Post_TaskAttr_Nop },
0671   { 0, 0, 0, 0, 0, RtemsTimerReqInitiateServer_Post_Status_TooMany,
0672     RtemsTimerReqInitiateServer_Post_Started_No,
0673     RtemsTimerReqInitiateServer_Post_TaskPrio_NA,
0674     RtemsTimerReqInitiateServer_Post_TaskStack_NA,
0675     RtemsTimerReqInitiateServer_Post_TaskAttr_NA },
0676   { 0, 0, 0, 0, 0, RtemsTimerReqInitiateServer_Post_Status_InvPrio,
0677     RtemsTimerReqInitiateServer_Post_Started_No,
0678     RtemsTimerReqInitiateServer_Post_TaskPrio_NA,
0679     RtemsTimerReqInitiateServer_Post_TaskStack_NA,
0680     RtemsTimerReqInitiateServer_Post_TaskAttr_NA },
0681   { 0, 0, 0, 0, 0, RtemsTimerReqInitiateServer_Post_Status_Ok,
0682     RtemsTimerReqInitiateServer_Post_Started_Yes,
0683     RtemsTimerReqInitiateServer_Post_TaskPrio_Set,
0684     RtemsTimerReqInitiateServer_Post_TaskStack_Set,
0685     RtemsTimerReqInitiateServer_Post_TaskAttr_Set },
0686   { 0, 0, 0, 0, 0, RtemsTimerReqInitiateServer_Post_Status_Unsat,
0687     RtemsTimerReqInitiateServer_Post_Started_No,
0688     RtemsTimerReqInitiateServer_Post_TaskPrio_NA,
0689     RtemsTimerReqInitiateServer_Post_TaskStack_NA,
0690     RtemsTimerReqInitiateServer_Post_TaskAttr_NA }
0691 };
0692 
0693 static const uint8_t
0694 RtemsTimerReqInitiateServer_Map[] = {
0695   0, 0, 3, 1, 0, 0, 4, 1, 0, 0, 3, 1, 0, 0, 4, 1, 0, 0, 2, 2, 0, 0, 2, 2
0696 };
0697 
0698 static size_t RtemsTimerReqInitiateServer_Scope(
0699   void  *arg,
0700   char  *buf,
0701   size_t n
0702 )
0703 {
0704   RtemsTimerReqInitiateServer_Context *ctx;
0705 
0706   ctx = arg;
0707 
0708   if ( ctx->Map.in_action_loop ) {
0709     return T_get_scope(
0710       RtemsTimerReqInitiateServer_PreDesc,
0711       buf,
0712       n,
0713       ctx->Map.pcs
0714     );
0715   }
0716 
0717   return 0;
0718 }
0719 
0720 static T_fixture RtemsTimerReqInitiateServer_Fixture = {
0721   .setup = RtemsTimerReqInitiateServer_Setup_Wrap,
0722   .stop = NULL,
0723   .teardown = RtemsTimerReqInitiateServer_Teardown_Wrap,
0724   .scope = RtemsTimerReqInitiateServer_Scope,
0725   .initial_context = &RtemsTimerReqInitiateServer_Instance
0726 };
0727 
0728 static inline RtemsTimerReqInitiateServer_Entry
0729 RtemsTimerReqInitiateServer_PopEntry(
0730   RtemsTimerReqInitiateServer_Context *ctx
0731 )
0732 {
0733   size_t index;
0734 
0735   index = ctx->Map.index;
0736   ctx->Map.index = index + 1;
0737   return RtemsTimerReqInitiateServer_Entries[
0738     RtemsTimerReqInitiateServer_Map[ index ]
0739   ];
0740 }
0741 
0742 static void RtemsTimerReqInitiateServer_TestVariant(
0743   RtemsTimerReqInitiateServer_Context *ctx
0744 )
0745 {
0746   RtemsTimerReqInitiateServer_Pre_Priority_Prepare( ctx, ctx->Map.pcs[ 0 ] );
0747   RtemsTimerReqInitiateServer_Pre_Stack_Prepare( ctx, ctx->Map.pcs[ 1 ] );
0748   RtemsTimerReqInitiateServer_Pre_Started_Prepare( ctx, ctx->Map.pcs[ 2 ] );
0749   RtemsTimerReqInitiateServer_Pre_TaskObj_Prepare( ctx, ctx->Map.pcs[ 3 ] );
0750   RtemsTimerReqInitiateServer_Action( ctx );
0751   RtemsTimerReqInitiateServer_Post_Status_Check(
0752     ctx,
0753     ctx->Map.entry.Post_Status
0754   );
0755   RtemsTimerReqInitiateServer_Post_Started_Check(
0756     ctx,
0757     ctx->Map.entry.Post_Started
0758   );
0759   RtemsTimerReqInitiateServer_Post_TaskPrio_Check(
0760     ctx,
0761     ctx->Map.entry.Post_TaskPrio
0762   );
0763   RtemsTimerReqInitiateServer_Post_TaskStack_Check(
0764     ctx,
0765     ctx->Map.entry.Post_TaskStack
0766   );
0767   RtemsTimerReqInitiateServer_Post_TaskAttr_Check(
0768     ctx,
0769     ctx->Map.entry.Post_TaskAttr
0770   );
0771 }
0772 
0773 /**
0774  * @fn void T_case_body_RtemsTimerReqInitiateServer( void )
0775  */
0776 T_TEST_CASE_FIXTURE(
0777   RtemsTimerReqInitiateServer,
0778   &RtemsTimerReqInitiateServer_Fixture
0779 )
0780 {
0781   RtemsTimerReqInitiateServer_Context *ctx;
0782 
0783   ctx = T_fixture_context();
0784   ctx->Map.in_action_loop = true;
0785   ctx->Map.index = 0;
0786 
0787   for (
0788     ctx->Map.pcs[ 0 ] = RtemsTimerReqInitiateServer_Pre_Priority_Valid;
0789     ctx->Map.pcs[ 0 ] < RtemsTimerReqInitiateServer_Pre_Priority_NA;
0790     ++ctx->Map.pcs[ 0 ]
0791   ) {
0792     for (
0793       ctx->Map.pcs[ 1 ] = RtemsTimerReqInitiateServer_Pre_Stack_Allocatable;
0794       ctx->Map.pcs[ 1 ] < RtemsTimerReqInitiateServer_Pre_Stack_NA;
0795       ++ctx->Map.pcs[ 1 ]
0796     ) {
0797       for (
0798         ctx->Map.pcs[ 2 ] = RtemsTimerReqInitiateServer_Pre_Started_Yes;
0799         ctx->Map.pcs[ 2 ] < RtemsTimerReqInitiateServer_Pre_Started_NA;
0800         ++ctx->Map.pcs[ 2 ]
0801       ) {
0802         for (
0803           ctx->Map.pcs[ 3 ] = RtemsTimerReqInitiateServer_Pre_TaskObj_Available;
0804           ctx->Map.pcs[ 3 ] < RtemsTimerReqInitiateServer_Pre_TaskObj_NA;
0805           ++ctx->Map.pcs[ 3 ]
0806         ) {
0807           ctx->Map.entry = RtemsTimerReqInitiateServer_PopEntry( ctx );
0808           RtemsTimerReqInitiateServer_TestVariant( ctx );
0809           RtemsTimerReqInitiateServer_Cleanup( ctx );
0810         }
0811       }
0812     }
0813   }
0814 }
0815 
0816 /** @} */