File indexing completed on 2025-05-11 08:24:52
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 #ifdef HAVE_CONFIG_H
0052 #include "config.h"
0053 #endif
0054
0055 #include <rtems.h>
0056
0057 #include "ts-config.h"
0058 #include "tx-support.h"
0059
0060 #include <rtems/test.h>
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070 typedef enum {
0071 RtemsTaskReqGetPriority_Pre_TaskId_Invalid,
0072 RtemsTaskReqGetPriority_Pre_TaskId_Task,
0073 RtemsTaskReqGetPriority_Pre_TaskId_NA
0074 } RtemsTaskReqGetPriority_Pre_TaskId;
0075
0076 typedef enum {
0077 RtemsTaskReqGetPriority_Pre_SchedulerId_Invalid,
0078 RtemsTaskReqGetPriority_Pre_SchedulerId_Scheduler,
0079 RtemsTaskReqGetPriority_Pre_SchedulerId_NA
0080 } RtemsTaskReqGetPriority_Pre_SchedulerId;
0081
0082 typedef enum {
0083 RtemsTaskReqGetPriority_Pre_Scheduler_Eligible,
0084 RtemsTaskReqGetPriority_Pre_Scheduler_Ineligible,
0085 RtemsTaskReqGetPriority_Pre_Scheduler_NA
0086 } RtemsTaskReqGetPriority_Pre_Scheduler;
0087
0088 typedef enum {
0089 RtemsTaskReqGetPriority_Pre_Priority_Valid,
0090 RtemsTaskReqGetPriority_Pre_Priority_Null,
0091 RtemsTaskReqGetPriority_Pre_Priority_NA
0092 } RtemsTaskReqGetPriority_Pre_Priority;
0093
0094 typedef enum {
0095 RtemsTaskReqGetPriority_Post_Status_Ok,
0096 RtemsTaskReqGetPriority_Post_Status_InvAddr,
0097 RtemsTaskReqGetPriority_Post_Status_InvId,
0098 RtemsTaskReqGetPriority_Post_Status_NotDef,
0099 RtemsTaskReqGetPriority_Post_Status_NA
0100 } RtemsTaskReqGetPriority_Post_Status;
0101
0102 typedef enum {
0103 RtemsTaskReqGetPriority_Post_PriorityObj_Set,
0104 RtemsTaskReqGetPriority_Post_PriorityObj_Nop,
0105 RtemsTaskReqGetPriority_Post_PriorityObj_NA
0106 } RtemsTaskReqGetPriority_Post_PriorityObj;
0107
0108 typedef struct {
0109 uint16_t Skip : 1;
0110 uint16_t Pre_TaskId_NA : 1;
0111 uint16_t Pre_SchedulerId_NA : 1;
0112 uint16_t Pre_Scheduler_NA : 1;
0113 uint16_t Pre_Priority_NA : 1;
0114 uint16_t Post_Status : 3;
0115 uint16_t Post_PriorityObj : 2;
0116 } RtemsTaskReqGetPriority_Entry;
0117
0118
0119
0120
0121 typedef struct {
0122
0123
0124
0125 rtems_id scheduler_a_id;
0126
0127
0128
0129
0130 rtems_id scheduler_b_id;
0131
0132
0133
0134
0135
0136 rtems_task_priority priority_obj;
0137
0138
0139
0140
0141
0142 rtems_status_code status;
0143
0144
0145
0146
0147 rtems_id task_id;
0148
0149
0150
0151
0152 rtems_id scheduler_id;
0153
0154
0155
0156
0157 rtems_id *priority;
0158
0159 struct {
0160
0161
0162
0163
0164 size_t pci[ 4 ];
0165
0166
0167
0168
0169 size_t pcs[ 4 ];
0170
0171
0172
0173
0174 bool in_action_loop;
0175
0176
0177
0178
0179 size_t index;
0180
0181
0182
0183
0184 RtemsTaskReqGetPriority_Entry entry;
0185
0186
0187
0188
0189
0190 bool skip;
0191 } Map;
0192 } RtemsTaskReqGetPriority_Context;
0193
0194 static RtemsTaskReqGetPriority_Context
0195 RtemsTaskReqGetPriority_Instance;
0196
0197 static const char * const RtemsTaskReqGetPriority_PreDesc_TaskId[] = {
0198 "Invalid",
0199 "Task",
0200 "NA"
0201 };
0202
0203 static const char * const RtemsTaskReqGetPriority_PreDesc_SchedulerId[] = {
0204 "Invalid",
0205 "Scheduler",
0206 "NA"
0207 };
0208
0209 static const char * const RtemsTaskReqGetPriority_PreDesc_Scheduler[] = {
0210 "Eligible",
0211 "Ineligible",
0212 "NA"
0213 };
0214
0215 static const char * const RtemsTaskReqGetPriority_PreDesc_Priority[] = {
0216 "Valid",
0217 "Null",
0218 "NA"
0219 };
0220
0221 static const char * const * const RtemsTaskReqGetPriority_PreDesc[] = {
0222 RtemsTaskReqGetPriority_PreDesc_TaskId,
0223 RtemsTaskReqGetPriority_PreDesc_SchedulerId,
0224 RtemsTaskReqGetPriority_PreDesc_Scheduler,
0225 RtemsTaskReqGetPriority_PreDesc_Priority,
0226 NULL
0227 };
0228
0229 static void RtemsTaskReqGetPriority_Pre_TaskId_Prepare(
0230 RtemsTaskReqGetPriority_Context *ctx,
0231 RtemsTaskReqGetPriority_Pre_TaskId state
0232 )
0233 {
0234 switch ( state ) {
0235 case RtemsTaskReqGetPriority_Pre_TaskId_Invalid: {
0236
0237
0238
0239 ctx->task_id = INVALID_ID;
0240 break;
0241 }
0242
0243 case RtemsTaskReqGetPriority_Pre_TaskId_Task: {
0244
0245
0246
0247 ctx->task_id = RTEMS_SELF;
0248 break;
0249 }
0250
0251 case RtemsTaskReqGetPriority_Pre_TaskId_NA:
0252 break;
0253 }
0254 }
0255
0256 static void RtemsTaskReqGetPriority_Pre_SchedulerId_Prepare(
0257 RtemsTaskReqGetPriority_Context *ctx,
0258 RtemsTaskReqGetPriority_Pre_SchedulerId state
0259 )
0260 {
0261 switch ( state ) {
0262 case RtemsTaskReqGetPriority_Pre_SchedulerId_Invalid: {
0263
0264
0265
0266
0267 ctx->scheduler_id = INVALID_ID;
0268 break;
0269 }
0270
0271 case RtemsTaskReqGetPriority_Pre_SchedulerId_Scheduler: {
0272
0273
0274
0275 ctx->scheduler_id = ctx->scheduler_a_id;
0276 break;
0277 }
0278
0279 case RtemsTaskReqGetPriority_Pre_SchedulerId_NA:
0280 break;
0281 }
0282 }
0283
0284 static void RtemsTaskReqGetPriority_Pre_Scheduler_Prepare(
0285 RtemsTaskReqGetPriority_Context *ctx,
0286 RtemsTaskReqGetPriority_Pre_Scheduler state
0287 )
0288 {
0289 switch ( state ) {
0290 case RtemsTaskReqGetPriority_Pre_Scheduler_Eligible: {
0291
0292
0293
0294
0295 ctx->scheduler_id = ctx->scheduler_a_id;
0296 break;
0297 }
0298
0299 case RtemsTaskReqGetPriority_Pre_Scheduler_Ineligible: {
0300
0301
0302
0303
0304 ctx->scheduler_id = ctx->scheduler_b_id;
0305 break;
0306 }
0307
0308 case RtemsTaskReqGetPriority_Pre_Scheduler_NA:
0309 break;
0310 }
0311 }
0312
0313 static void RtemsTaskReqGetPriority_Pre_Priority_Prepare(
0314 RtemsTaskReqGetPriority_Context *ctx,
0315 RtemsTaskReqGetPriority_Pre_Priority state
0316 )
0317 {
0318 switch ( state ) {
0319 case RtemsTaskReqGetPriority_Pre_Priority_Valid: {
0320
0321
0322
0323
0324 ctx->priority = &ctx->priority_obj;
0325 break;
0326 }
0327
0328 case RtemsTaskReqGetPriority_Pre_Priority_Null: {
0329
0330
0331
0332 ctx->priority = NULL;
0333 break;
0334 }
0335
0336 case RtemsTaskReqGetPriority_Pre_Priority_NA:
0337 break;
0338 }
0339 }
0340
0341 static void RtemsTaskReqGetPriority_Post_Status_Check(
0342 RtemsTaskReqGetPriority_Context *ctx,
0343 RtemsTaskReqGetPriority_Post_Status state
0344 )
0345 {
0346 switch ( state ) {
0347 case RtemsTaskReqGetPriority_Post_Status_Ok: {
0348
0349
0350
0351
0352 T_rsc_success( ctx->status );
0353 break;
0354 }
0355
0356 case RtemsTaskReqGetPriority_Post_Status_InvAddr: {
0357
0358
0359
0360
0361 T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
0362 break;
0363 }
0364
0365 case RtemsTaskReqGetPriority_Post_Status_InvId: {
0366
0367
0368
0369
0370 T_rsc( ctx->status, RTEMS_INVALID_ID );
0371 break;
0372 }
0373
0374 case RtemsTaskReqGetPriority_Post_Status_NotDef: {
0375
0376
0377
0378
0379 T_rsc( ctx->status, RTEMS_NOT_DEFINED );
0380 break;
0381 }
0382
0383 case RtemsTaskReqGetPriority_Post_Status_NA:
0384 break;
0385 }
0386 }
0387
0388 static void RtemsTaskReqGetPriority_Post_PriorityObj_Check(
0389 RtemsTaskReqGetPriority_Context *ctx,
0390 RtemsTaskReqGetPriority_Post_PriorityObj state
0391 )
0392 {
0393 switch ( state ) {
0394 case RtemsTaskReqGetPriority_Post_PriorityObj_Set: {
0395
0396
0397
0398
0399
0400
0401 T_eq_u32( ctx->priority_obj, PRIO_DEFAULT );
0402 break;
0403 }
0404
0405 case RtemsTaskReqGetPriority_Post_PriorityObj_Nop: {
0406
0407
0408
0409
0410
0411 T_eq_u32( ctx->priority_obj, PRIO_INVALID );
0412 break;
0413 }
0414
0415 case RtemsTaskReqGetPriority_Post_PriorityObj_NA:
0416 break;
0417 }
0418 }
0419
0420 static void RtemsTaskReqGetPriority_Setup(
0421 RtemsTaskReqGetPriority_Context *ctx
0422 )
0423 {
0424 rtems_status_code sc;
0425
0426 sc = rtems_scheduler_ident(
0427 TEST_SCHEDULER_A_NAME,
0428 &ctx->scheduler_a_id
0429 );
0430 T_rsc_success( sc );
0431
0432 #if defined(RTEMS_SMP)
0433 sc = rtems_scheduler_ident(
0434 TEST_SCHEDULER_B_NAME,
0435 &ctx->scheduler_b_id
0436 );
0437 T_rsc_success( sc );
0438 #endif
0439 }
0440
0441 static void RtemsTaskReqGetPriority_Setup_Wrap( void *arg )
0442 {
0443 RtemsTaskReqGetPriority_Context *ctx;
0444
0445 ctx = arg;
0446 ctx->Map.in_action_loop = false;
0447 RtemsTaskReqGetPriority_Setup( ctx );
0448 }
0449
0450 static void RtemsTaskReqGetPriority_Prepare(
0451 RtemsTaskReqGetPriority_Context *ctx
0452 )
0453 {
0454 ctx->priority_obj = PRIO_INVALID;
0455 }
0456
0457 static void RtemsTaskReqGetPriority_Action(
0458 RtemsTaskReqGetPriority_Context *ctx
0459 )
0460 {
0461 ctx->status = rtems_task_get_priority(
0462 ctx->task_id,
0463 ctx->scheduler_id,
0464 ctx->priority
0465 );
0466 }
0467
0468 static const RtemsTaskReqGetPriority_Entry
0469 RtemsTaskReqGetPriority_Entries[] = {
0470 { 0, 0, 0, 1, 0, RtemsTaskReqGetPriority_Post_Status_InvId,
0471 RtemsTaskReqGetPriority_Post_PriorityObj_Nop },
0472 { 0, 0, 0, 1, 0, RtemsTaskReqGetPriority_Post_Status_InvAddr,
0473 RtemsTaskReqGetPriority_Post_PriorityObj_Nop },
0474 { 0, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_Ok,
0475 RtemsTaskReqGetPriority_Post_PriorityObj_Set },
0476 { 0, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_InvAddr,
0477 RtemsTaskReqGetPriority_Post_PriorityObj_Nop },
0478 #if defined(RTEMS_SMP)
0479 { 0, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_NotDef,
0480 RtemsTaskReqGetPriority_Post_PriorityObj_Nop },
0481 #else
0482 { 1, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_NA,
0483 RtemsTaskReqGetPriority_Post_PriorityObj_NA },
0484 #endif
0485 #if defined(RTEMS_SMP)
0486 { 0, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_InvAddr,
0487 RtemsTaskReqGetPriority_Post_PriorityObj_Nop }
0488 #else
0489 { 1, 0, 0, 0, 0, RtemsTaskReqGetPriority_Post_Status_NA,
0490 RtemsTaskReqGetPriority_Post_PriorityObj_NA }
0491 #endif
0492 };
0493
0494 static const uint8_t
0495 RtemsTaskReqGetPriority_Map[] = {
0496 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 3, 4, 5
0497 };
0498
0499 static size_t RtemsTaskReqGetPriority_Scope( void *arg, char *buf, size_t n )
0500 {
0501 RtemsTaskReqGetPriority_Context *ctx;
0502
0503 ctx = arg;
0504
0505 if ( ctx->Map.in_action_loop ) {
0506 return T_get_scope(
0507 RtemsTaskReqGetPriority_PreDesc,
0508 buf,
0509 n,
0510 ctx->Map.pcs
0511 );
0512 }
0513
0514 return 0;
0515 }
0516
0517 static T_fixture RtemsTaskReqGetPriority_Fixture = {
0518 .setup = RtemsTaskReqGetPriority_Setup_Wrap,
0519 .stop = NULL,
0520 .teardown = NULL,
0521 .scope = RtemsTaskReqGetPriority_Scope,
0522 .initial_context = &RtemsTaskReqGetPriority_Instance
0523 };
0524
0525 static inline RtemsTaskReqGetPriority_Entry RtemsTaskReqGetPriority_PopEntry(
0526 RtemsTaskReqGetPriority_Context *ctx
0527 )
0528 {
0529 size_t index;
0530
0531 index = ctx->Map.index;
0532 ctx->Map.index = index + 1;
0533 return RtemsTaskReqGetPriority_Entries[
0534 RtemsTaskReqGetPriority_Map[ index ]
0535 ];
0536 }
0537
0538 static void RtemsTaskReqGetPriority_SetPreConditionStates(
0539 RtemsTaskReqGetPriority_Context *ctx
0540 )
0541 {
0542 ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ];
0543 ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ];
0544
0545 if ( ctx->Map.entry.Pre_Scheduler_NA ) {
0546 ctx->Map.pcs[ 2 ] = RtemsTaskReqGetPriority_Pre_Scheduler_NA;
0547 } else {
0548 ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ];
0549 }
0550
0551 ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ];
0552 }
0553
0554 static void RtemsTaskReqGetPriority_TestVariant(
0555 RtemsTaskReqGetPriority_Context *ctx
0556 )
0557 {
0558 RtemsTaskReqGetPriority_Pre_TaskId_Prepare( ctx, ctx->Map.pcs[ 0 ] );
0559 RtemsTaskReqGetPriority_Pre_SchedulerId_Prepare( ctx, ctx->Map.pcs[ 1 ] );
0560 RtemsTaskReqGetPriority_Pre_Scheduler_Prepare( ctx, ctx->Map.pcs[ 2 ] );
0561 RtemsTaskReqGetPriority_Pre_Priority_Prepare( ctx, ctx->Map.pcs[ 3 ] );
0562 RtemsTaskReqGetPriority_Action( ctx );
0563 RtemsTaskReqGetPriority_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
0564 RtemsTaskReqGetPriority_Post_PriorityObj_Check(
0565 ctx,
0566 ctx->Map.entry.Post_PriorityObj
0567 );
0568 }
0569
0570
0571
0572
0573 T_TEST_CASE_FIXTURE(
0574 RtemsTaskReqGetPriority,
0575 &RtemsTaskReqGetPriority_Fixture
0576 )
0577 {
0578 RtemsTaskReqGetPriority_Context *ctx;
0579
0580 ctx = T_fixture_context();
0581 ctx->Map.in_action_loop = true;
0582 ctx->Map.index = 0;
0583
0584 for (
0585 ctx->Map.pci[ 0 ] = RtemsTaskReqGetPriority_Pre_TaskId_Invalid;
0586 ctx->Map.pci[ 0 ] < RtemsTaskReqGetPriority_Pre_TaskId_NA;
0587 ++ctx->Map.pci[ 0 ]
0588 ) {
0589 for (
0590 ctx->Map.pci[ 1 ] = RtemsTaskReqGetPriority_Pre_SchedulerId_Invalid;
0591 ctx->Map.pci[ 1 ] < RtemsTaskReqGetPriority_Pre_SchedulerId_NA;
0592 ++ctx->Map.pci[ 1 ]
0593 ) {
0594 for (
0595 ctx->Map.pci[ 2 ] = RtemsTaskReqGetPriority_Pre_Scheduler_Eligible;
0596 ctx->Map.pci[ 2 ] < RtemsTaskReqGetPriority_Pre_Scheduler_NA;
0597 ++ctx->Map.pci[ 2 ]
0598 ) {
0599 for (
0600 ctx->Map.pci[ 3 ] = RtemsTaskReqGetPriority_Pre_Priority_Valid;
0601 ctx->Map.pci[ 3 ] < RtemsTaskReqGetPriority_Pre_Priority_NA;
0602 ++ctx->Map.pci[ 3 ]
0603 ) {
0604 ctx->Map.entry = RtemsTaskReqGetPriority_PopEntry( ctx );
0605
0606 if ( ctx->Map.entry.Skip ) {
0607 continue;
0608 }
0609
0610 RtemsTaskReqGetPriority_SetPreConditionStates( ctx );
0611 RtemsTaskReqGetPriority_Prepare( ctx );
0612 RtemsTaskReqGetPriority_TestVariant( ctx );
0613 }
0614 }
0615 }
0616 }
0617 }
0618
0619