summaryrefslogblamecommitdiffstats
path: root/spec/rtems/barrier/req/delete.yml
blob: f961d8e13d974a8edd0090e3ebe65b108033619a (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
















                                                                         
                                          



                                             
                                                         


                                          
            







                                            
                                                      




                                            
                                                          





















                                                        
               
                
                  
           
                                                                           

                     
                
                                
           
                                                                            
                














                                                 




                                                   






































































































































                                                                               
                 


                 
             


                  
               


                 
           
                 
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
copyrights:
- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
enabled-by: true
functional-type: action
links:
- role: interface-function
  uid: ../if/delete
post-conditions:
- name: Status
  states:
  - name: Ok
    test-code: |
      ctx->barrier_id = 0;
      T_rsc_success( ctx->status );
    text: |
      The return status of ${../if/delete:/name} shall be
      ${../../status/if/successful:/name}.
  - name: InvId
    test-code: |
      T_rsc( ctx->status, RTEMS_INVALID_ID );
    text: |
      The return status of ${../if/delete:/name} shall be
      ${../../status/if/invalid-id:/name}.
  test-epilogue: null
  test-prologue: null
- name: Name
  states:
  - name: Valid
    test-code: |
      id = 0;
      sc = rtems_barrier_ident( NAME, &id );
      T_rsc_success( sc );
      T_eq_u32( id, ctx->barrier_id );
    text: |
      The unique object name shall identify a barrier.
  - name: Invalid
    test-code: |
      sc = rtems_barrier_ident( NAME, &id );
      T_rsc( sc, RTEMS_INVALID_NAME );
    text: |
      The unique object name shall not identify a barrier.
  test-epilogue: null
  test-prologue: |
    rtems_status_code sc;
    rtems_id          id;
- name: Flush
  states:
  - name: 'Yes'
    test-code: |
      ++ctx->wait_expected;
      T_eq_u32( ctx->wait_done, ctx->wait_expected );
    text: |
      Tasks waiting at the barrier shall be unblocked.
  - name: 'No'
    test-code: |
      T_eq_u32( ctx->wait_done, ctx->wait_expected );
    text: |
      Tasks waiting at the barrier shall remain blocked.
  test-epilogue: null
  test-prologue: null
pre-conditions:
- name: Id
  states:
  - name: NoObj
    test-code: |
      ctx->id = 0;
    text: |
      While the ${../if/delete:/params[0]/name} parameter is not associated
      with a barrier.
  - name: Barrier
    test-code: |
      ctx->id = ctx->barrier_id;
    text: |
      While the ${../if/delete:/params[0]/name} parameter is associated with
      a barrier.
  test-epilogue: null
  test-prologue: null
rationale: null
references: []
requirement-type: functional
skip-reasons: {}
test-action: |
  ctx->status = rtems_barrier_delete( ctx->id );
test-brief: null
test-cleanup: |
  if ( ctx->barrier_id != 0 ) {
    rtems_status_code sc;

    sc = rtems_barrier_delete( ctx->barrier_id );
    T_rsc_success( sc );

    ++ctx->wait_expected;
    T_eq_u32( ctx->wait_done, ctx->wait_expected );

    ctx->barrier_id = 0;
  }
test-context:
- brief: null
  description: null
  member: |
    rtems_id worker_id
- brief: null
  description: null
  member: |
    rtems_id barrier_id
- brief: null
  description: null
  member: |
    uint32_t wait_done
- brief: null
  description: null
  member: |
    uint32_t wait_expected
- brief: null
  description: null
  member: |
    rtems_id id
- brief: null
  description: null
  member: |
    rtems_status_code status
test-context-support: null
test-description: null
test-header: null
test-includes:
- rtems.h
- string.h
test-local-includes: []
test-prepare: |
  rtems_status_code   sc;
  rtems_task_priority prio;

  prio = 0;
  sc = rtems_task_set_priority( ctx->worker_id, PRIO_HIGH, &prio );
  T_rsc_success( sc );
  T_true( prio == PRIO_LOW || prio == PRIO_HIGH );
test-setup:
  brief: null
  code: |
    rtems_status_code   sc;
    rtems_task_priority prio;

    memset( ctx, 0, sizeof( *ctx ) );

    prio = 0;
    sc = rtems_task_set_priority( RTEMS_SELF, PRIO_NORMAL, &prio );
    T_rsc_success( sc );
    T_eq_u32( prio, PRIO_HIGH );

    sc = rtems_task_create(
      rtems_build_name( 'W', 'O', 'R', 'K' ),
      PRIO_LOW,
      RTEMS_MINIMUM_STACK_SIZE,
      RTEMS_DEFAULT_MODES,
      RTEMS_DEFAULT_ATTRIBUTES,
      &ctx->worker_id
    );
    T_assert_rsc_success( sc );

    sc = rtems_task_start( ctx->worker_id, Worker, (rtems_task_argument) ctx );
    T_assert_rsc_success( sc );
  description: null
test-stop: null
test-support: |
  #define NAME rtems_build_name( 'T', 'E', 'S', 'T' )

  typedef RtemsBarrierReqDelete_Context Context;

  typedef enum {
    PRIO_HIGH = 1,
    PRIO_NORMAL,
    PRIO_LOW
  } Priorities;

  static void Worker( rtems_task_argument arg )
  {
    Context *ctx;

    ctx = (Context *) arg;

    while ( true ) {
      rtems_status_code   sc;
      rtems_task_priority prio;

      T_eq_u32( ctx->barrier_id, 0 );

      sc = rtems_barrier_create(
        NAME,
        RTEMS_DEFAULT_ATTRIBUTES,
        0,
        &ctx->barrier_id
      );
      T_rsc_success( sc );

      sc = rtems_barrier_wait(
        ctx->barrier_id,
        RTEMS_NO_TIMEOUT
      );
      T_rsc( sc, RTEMS_OBJECT_WAS_DELETED );

      ++ctx->wait_done;

      prio = 0;
      sc = rtems_task_set_priority( RTEMS_SELF, PRIO_LOW, &prio );
      T_rsc_success( sc );
      T_eq_u32( prio, PRIO_HIGH );
    }
  }
test-target: testsuites/validation/tc-barrier-delete.c
test-teardown:
  brief: null
  code: |
    rtems_status_code   sc;
    rtems_task_priority prio;

    prio = 0;
    sc = rtems_task_set_priority( RTEMS_SELF, PRIO_HIGH, &prio );
    T_rsc_success( sc );
    T_eq_u32( prio, PRIO_NORMAL );

    if ( ctx->worker_id != 0 ) {
      sc = rtems_task_delete( ctx->worker_id );
      T_rsc_success( sc );
    }
  description: null
text: ${.:text-template}
transition-map:
- enabled-by: true
  post-conditions:
    Status: Ok
    Name: Invalid
    Flush: 'Yes'
  pre-conditions:
    Id:
    - Barrier
- enabled-by: true
  post-conditions:
    Status: InvId
    Name: Valid
    Flush: 'No'
  pre-conditions:
    Id:
    - NoObj
type: requirement