diff options
Diffstat (limited to 'testsuites/validation/tc-intr-get-affinity.c')
-rw-r--r-- | testsuites/validation/tc-intr-get-affinity.c | 229 |
1 files changed, 140 insertions, 89 deletions
diff --git a/testsuites/validation/tc-intr-get-affinity.c b/testsuites/validation/tc-intr-get-affinity.c index e0de9e37ec..60509203b4 100644 --- a/testsuites/validation/tc-intr-get-affinity.c +++ b/testsuites/validation/tc-intr-get-affinity.c @@ -3,11 +3,11 @@ /** * @file * - * @ingroup RTEMSTestCaseRtemsIntrReqGetAffinity + * @ingroup RtemsIntrReqGetAffinity */ /* - * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de) + * Copyright (C) 2021 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -61,10 +61,9 @@ #include <rtems/test.h> /** - * @defgroup RTEMSTestCaseRtemsIntrReqGetAffinity \ - * spec:/rtems/intr/req/get-affinity + * @defgroup RtemsIntrReqGetAffinity spec:/rtems/intr/req/get-affinity * - * @ingroup RTEMSTestSuiteTestsuitesValidation0 + * @ingroup TestsuitesValidationIntr * * @{ */ @@ -111,6 +110,16 @@ typedef enum { RtemsIntrReqGetAffinity_Post_CPUSetObj_NA } RtemsIntrReqGetAffinity_Post_CPUSetObj; +typedef struct { + uint16_t Skip : 1; + uint16_t Pre_Vector_NA : 1; + uint16_t Pre_CPUSetSize_NA : 1; + uint16_t Pre_CPUSet_NA : 1; + uint16_t Pre_CanGetAffinity_NA : 1; + uint16_t Post_Status : 3; + uint16_t Post_CPUSetObj : 3; +} RtemsIntrReqGetAffinity_Entry; + /** * @brief Test context for spec:/rtems/intr/req/get-affinity test case. */ @@ -129,7 +138,7 @@ typedef struct { * @brief This member provides the object referenced by the ``affinity`` * parameter. */ - cpu_set_t cpuset_obj; + cpu_set_t cpuset_obj[ 2 ]; /** * @brief This member contains the return value of the @@ -153,16 +162,39 @@ typedef struct { */ cpu_set_t *cpuset; - /** - * @brief This member defines the pre-condition states for the next action. - */ - size_t pcs[ 4 ]; - - /** - * @brief This member indicates if the test action loop is currently - * executed. - */ - bool in_action_loop; + struct { + /** + * @brief This member defines the pre-condition indices for the next + * action. + */ + size_t pci[ 4 ]; + + /** + * @brief This member defines the pre-condition states for the next action. + */ + size_t pcs[ 4 ]; + + /** + * @brief If this member is true, then the test action loop is executed. + */ + bool in_action_loop; + + /** + * @brief This member contains the next transition map index. + */ + size_t index; + + /** + * @brief This member contains the current transition map entry. + */ + RtemsIntrReqGetAffinity_Entry entry; + + /** + * @brief If this member is true, then the current transition variant + * should be skipped. + */ + bool skip; + } Map; } RtemsIntrReqGetAffinity_Context; static RtemsIntrReqGetAffinity_Context @@ -209,12 +241,15 @@ static void CheckGetAffinity( ) { rtems_status_code sc; - cpu_set_t set; + cpu_set_t set[ 2 ]; + + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Warray-bounds" if ( attr->can_get_affinity ) { - CPU_ZERO( &ctx->cpuset_obj ); + CPU_ZERO_S( sizeof( ctx->cpuset_obj ), ctx->cpuset_obj ); } else { - CPU_FILL( &ctx->cpuset_obj ); + CPU_FILL_S( sizeof( ctx->cpuset_obj ), ctx->cpuset_obj ); } sc = rtems_interrupt_get_affinity( @@ -223,15 +258,17 @@ static void CheckGetAffinity( ctx->cpuset ); - CPU_ZERO( &set ); + CPU_ZERO_S( sizeof( set ), set ); if ( attr->can_get_affinity ) { T_rsc_success( sc ); - T_ne_int( CPU_CMP( &ctx->cpuset_obj, &set ), 0 ); + T_false( CPU_EQUAL_S( sizeof( set ), ctx->cpuset_obj, set ) ); } else { T_rsc( sc, RTEMS_UNSATISFIED ); - T_eq_int( CPU_CMP( &ctx->cpuset_obj, &set ), 0 ); + T_true( CPU_EQUAL_S( sizeof( set ), ctx->cpuset_obj, set ) ); } + + #pragma GCC diagnostic pop } static void RtemsIntrReqGetAffinity_Pre_Vector_Prepare( @@ -271,7 +308,7 @@ static void RtemsIntrReqGetAffinity_Pre_CPUSetSize_Prepare( case RtemsIntrReqGetAffinity_Pre_CPUSetSize_Valid: { /* * While the ``affinity_size`` parameter is an integral multiple of the - * size of long, while the ``affinity_size`` parameter specifies a + * size of ``long``, while the ``affinity_size`` parameter specifies a * processor set which is large enough to contain the processor affinity * set of the interrupt specified by ``vector``. */ @@ -282,7 +319,7 @@ static void RtemsIntrReqGetAffinity_Pre_CPUSetSize_Prepare( case RtemsIntrReqGetAffinity_Pre_CPUSetSize_TooSmall: { /* * While the ``affinity_size`` parameter is an integral multiple of the - * size of long, while the ``affinity_size`` parameter specifies a + * size of ``long``, while the ``affinity_size`` parameter specifies a * processor set which is not large enough to contain the processor * affinity set of the interrupt specified by ``vector``. */ @@ -293,7 +330,7 @@ static void RtemsIntrReqGetAffinity_Pre_CPUSetSize_Prepare( case RtemsIntrReqGetAffinity_Pre_CPUSetSize_Askew: { /* * While the ``affinity_size`` parameter is not an integral multiple of - * the size of long. + * the size of ``long``. */ ctx->cpusetsize = SIZE_MAX; break; @@ -315,7 +352,7 @@ static void RtemsIntrReqGetAffinity_Pre_CPUSet_Prepare( * While the ``affinity`` parameter references an object of type * cpu_set_t. */ - ctx->cpuset = &ctx->cpuset_obj; + ctx->cpuset = ctx->cpuset_obj; break; } @@ -492,7 +529,7 @@ static void RtemsIntrReqGetAffinity_Setup_Wrap( void *arg ) RtemsIntrReqGetAffinity_Context *ctx; ctx = arg; - ctx->in_action_loop = false; + ctx->Map.in_action_loop = false; RtemsIntrReqGetAffinity_Setup( ctx ); } @@ -502,7 +539,7 @@ static void RtemsIntrReqGetAffinity_Action( { if ( ctx->valid_vector && ctx->cpusetsize == sizeof( ctx->cpuset_obj ) && - ctx->cpuset == &ctx->cpuset_obj + ctx->cpuset == ctx->cpuset_obj ) { for ( ctx->vector = 0; @@ -524,7 +561,7 @@ static void RtemsIntrReqGetAffinity_Action( CheckGetAffinity( ctx, &attr ); } } else { - cpu_set_t set; + cpu_set_t set[ 2 ]; if ( ctx->valid_vector ) { ctx->vector = ctx->some_vector; @@ -532,7 +569,10 @@ static void RtemsIntrReqGetAffinity_Action( ctx->vector = BSP_INTERRUPT_VECTOR_COUNT; } - CPU_FILL( &ctx->cpuset_obj ); + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Warray-bounds" + + CPU_FILL_S( sizeof( ctx->cpuset_obj ), ctx->cpuset_obj ); ctx->status = rtems_interrupt_get_affinity( ctx->vector, @@ -540,26 +580,21 @@ static void RtemsIntrReqGetAffinity_Action( ctx->cpuset ); - if ( ctx->cpuset == NULL || ctx->cpusetsize != sizeof( ctx->cpuset ) ) { - CPU_FILL( &set ); + if ( + ctx->cpuset == NULL || + ctx->cpusetsize != sizeof( ctx->cpuset_obj ) + ) { + CPU_FILL_S( sizeof( set ), set ); } else { - CPU_ZERO( &set ); + CPU_ZERO_S( sizeof( set ), set ); } - T_eq_int( CPU_CMP( &ctx->cpuset_obj, &set ), 0 ); + T_true( CPU_EQUAL_S( sizeof( set ), ctx->cpuset_obj, set ) ); + + #pragma GCC diagnostic pop } } -typedef struct { - uint16_t Skip : 1; - uint16_t Pre_Vector_NA : 1; - uint16_t Pre_CPUSetSize_NA : 1; - uint16_t Pre_CPUSet_NA : 1; - uint16_t Pre_CanGetAffinity_NA : 1; - uint16_t Post_Status : 3; - uint16_t Post_CPUSetObj : 3; -} RtemsIntrReqGetAffinity_Entry; - static const RtemsIntrReqGetAffinity_Entry RtemsIntrReqGetAffinity_Entries[] = { { 0, 0, 0, 0, 0, RtemsIntrReqGetAffinity_Post_Status_InvAddr, @@ -589,8 +624,13 @@ static size_t RtemsIntrReqGetAffinity_Scope( void *arg, char *buf, size_t n ) ctx = arg; - if ( ctx->in_action_loop ) { - return T_get_scope( RtemsIntrReqGetAffinity_PreDesc, buf, n, ctx->pcs ); + if ( ctx->Map.in_action_loop ) { + return T_get_scope( + RtemsIntrReqGetAffinity_PreDesc, + buf, + n, + ctx->Map.pcs + ); } return 0; @@ -604,15 +644,50 @@ static T_fixture RtemsIntrReqGetAffinity_Fixture = { .initial_context = &RtemsIntrReqGetAffinity_Instance }; -static inline RtemsIntrReqGetAffinity_Entry RtemsIntrReqGetAffinity_GetEntry( - size_t index +static inline RtemsIntrReqGetAffinity_Entry RtemsIntrReqGetAffinity_PopEntry( + RtemsIntrReqGetAffinity_Context *ctx ) { + size_t index; + + index = ctx->Map.index; + ctx->Map.index = index + 1; return RtemsIntrReqGetAffinity_Entries[ RtemsIntrReqGetAffinity_Map[ index ] ]; } +static void RtemsIntrReqGetAffinity_SetPreConditionStates( + RtemsIntrReqGetAffinity_Context *ctx +) +{ + ctx->Map.pcs[ 0 ] = ctx->Map.pci[ 0 ]; + ctx->Map.pcs[ 1 ] = ctx->Map.pci[ 1 ]; + ctx->Map.pcs[ 2 ] = ctx->Map.pci[ 2 ]; + + if ( ctx->Map.entry.Pre_CanGetAffinity_NA ) { + ctx->Map.pcs[ 3 ] = RtemsIntrReqGetAffinity_Pre_CanGetAffinity_NA; + } else { + ctx->Map.pcs[ 3 ] = ctx->Map.pci[ 3 ]; + } +} + +static void RtemsIntrReqGetAffinity_TestVariant( + RtemsIntrReqGetAffinity_Context *ctx +) +{ + RtemsIntrReqGetAffinity_Pre_Vector_Prepare( ctx, ctx->Map.pcs[ 0 ] ); + RtemsIntrReqGetAffinity_Pre_CPUSetSize_Prepare( ctx, ctx->Map.pcs[ 1 ] ); + RtemsIntrReqGetAffinity_Pre_CPUSet_Prepare( ctx, ctx->Map.pcs[ 2 ] ); + RtemsIntrReqGetAffinity_Pre_CanGetAffinity_Prepare( ctx, ctx->Map.pcs[ 3 ] ); + RtemsIntrReqGetAffinity_Action( ctx ); + RtemsIntrReqGetAffinity_Post_Status_Check( ctx, ctx->Map.entry.Post_Status ); + RtemsIntrReqGetAffinity_Post_CPUSetObj_Check( + ctx, + ctx->Map.entry.Post_CPUSetObj + ); +} + /** * @fn void T_case_body_RtemsIntrReqGetAffinity( void ) */ @@ -622,58 +697,34 @@ T_TEST_CASE_FIXTURE( ) { RtemsIntrReqGetAffinity_Context *ctx; - size_t index; ctx = T_fixture_context(); - ctx->in_action_loop = true; - index = 0; + ctx->Map.in_action_loop = true; + ctx->Map.index = 0; for ( - ctx->pcs[ 0 ] = RtemsIntrReqGetAffinity_Pre_Vector_Valid; - ctx->pcs[ 0 ] < RtemsIntrReqGetAffinity_Pre_Vector_NA; - ++ctx->pcs[ 0 ] + ctx->Map.pci[ 0 ] = RtemsIntrReqGetAffinity_Pre_Vector_Valid; + ctx->Map.pci[ 0 ] < RtemsIntrReqGetAffinity_Pre_Vector_NA; + ++ctx->Map.pci[ 0 ] ) { for ( - ctx->pcs[ 1 ] = RtemsIntrReqGetAffinity_Pre_CPUSetSize_Valid; - ctx->pcs[ 1 ] < RtemsIntrReqGetAffinity_Pre_CPUSetSize_NA; - ++ctx->pcs[ 1 ] + ctx->Map.pci[ 1 ] = RtemsIntrReqGetAffinity_Pre_CPUSetSize_Valid; + ctx->Map.pci[ 1 ] < RtemsIntrReqGetAffinity_Pre_CPUSetSize_NA; + ++ctx->Map.pci[ 1 ] ) { for ( - ctx->pcs[ 2 ] = RtemsIntrReqGetAffinity_Pre_CPUSet_Valid; - ctx->pcs[ 2 ] < RtemsIntrReqGetAffinity_Pre_CPUSet_NA; - ++ctx->pcs[ 2 ] + ctx->Map.pci[ 2 ] = RtemsIntrReqGetAffinity_Pre_CPUSet_Valid; + ctx->Map.pci[ 2 ] < RtemsIntrReqGetAffinity_Pre_CPUSet_NA; + ++ctx->Map.pci[ 2 ] ) { for ( - ctx->pcs[ 3 ] = RtemsIntrReqGetAffinity_Pre_CanGetAffinity_Yes; - ctx->pcs[ 3 ] < RtemsIntrReqGetAffinity_Pre_CanGetAffinity_NA; - ++ctx->pcs[ 3 ] + ctx->Map.pci[ 3 ] = RtemsIntrReqGetAffinity_Pre_CanGetAffinity_Yes; + ctx->Map.pci[ 3 ] < RtemsIntrReqGetAffinity_Pre_CanGetAffinity_NA; + ++ctx->Map.pci[ 3 ] ) { - RtemsIntrReqGetAffinity_Entry entry; - size_t pcs[ 4 ]; - - entry = RtemsIntrReqGetAffinity_GetEntry( index ); - ++index; - - memcpy( pcs, ctx->pcs, sizeof( pcs ) ); - - if ( entry.Pre_CanGetAffinity_NA ) { - ctx->pcs[ 3 ] = RtemsIntrReqGetAffinity_Pre_CanGetAffinity_NA; - } - - RtemsIntrReqGetAffinity_Pre_Vector_Prepare( ctx, ctx->pcs[ 0 ] ); - RtemsIntrReqGetAffinity_Pre_CPUSetSize_Prepare( ctx, ctx->pcs[ 1 ] ); - RtemsIntrReqGetAffinity_Pre_CPUSet_Prepare( ctx, ctx->pcs[ 2 ] ); - RtemsIntrReqGetAffinity_Pre_CanGetAffinity_Prepare( - ctx, - ctx->pcs[ 3 ] - ); - RtemsIntrReqGetAffinity_Action( ctx ); - RtemsIntrReqGetAffinity_Post_Status_Check( ctx, entry.Post_Status ); - RtemsIntrReqGetAffinity_Post_CPUSetObj_Check( - ctx, - entry.Post_CPUSetObj - ); - memcpy( ctx->pcs, pcs, sizeof( ctx->pcs ) ); + ctx->Map.entry = RtemsIntrReqGetAffinity_PopEntry( ctx ); + RtemsIntrReqGetAffinity_SetPreConditionStates( ctx ); + RtemsIntrReqGetAffinity_TestVariant( ctx ); } } } |