summaryrefslogblamecommitdiffstats
path: root/spec/rtems/task/req/construct-errors.yml
blob: b498131b1b37a9ddf843cb50b51bb5837a4d29a0 (plain) (tree)
1
2
3
4
5
6
7
8






                                                                         
                      












                                                                               
                                                                         

















































































































                                                                               
                                                             






























































































                                                                               
                                                              







































































                                                              
                                                                          
 
                                                                         




















                                                                      
                                                                        




                                                    
                                                             


































































































































































                                                     
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
copyrights:
- Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
enabled-by: true
functional-type: action
links:
- role: interface-function
  uid: ../if/construct
post-conditions:
- name: Status
  states:
  - name: Ok
    test-code: |
      T_rsc_success( ctx->status );
      T_eq_ptr( ctx->id, &ctx->id_value );
      T_ne_u32( ctx->id_value, 0xffffffff );

      sc = rtems_task_delete( ctx->id_value );
      T_rsc_success( sc );
    text: |
      The status shall be RTEMS_SUCCESSFUL.  The value of the object identifier
      referenced by the id parameter shall identify the constructed task.
  - name: InvAddress
    test-code: |
      T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
      T_null( ctx->id );
      T_eq_u32( ctx->id_value, 0xffffffff );
    text: |
      The status shall be RTEMS_INVALID_ADDRESS.
  - name: InvName
    test-code: |
      T_rsc( ctx->status, RTEMS_INVALID_NAME );
      T_eq_u32( ctx->id_value, 0xffffffff );
    text: |
      The status shall be RTEMS_INVALID_NAME.  If the id parameter is not NULL,
      then the value of the object identifier referenced by the id parameter
      shall be unchanged.
  - name: InvPrio
    test-code: |
      T_rsc( ctx->status, RTEMS_INVALID_PRIORITY );
      T_eq_u32( ctx->id_value, 0xffffffff );
    text: |
      The status shall be RTEMS_INVALID_PRIORITY.  If the id parameter is not
      NULL, then the value of the object identifier referenced by the id
      parameter shall be unchanged.
  - name: InvSize
    test-code: |
      T_rsc( ctx->status, RTEMS_INVALID_SIZE );
      T_eq_u32( ctx->id_value, 0xffffffff );
    text: |
      The status shall be RTEMS_INVALID_SIZE.  If the id parameter is not NULL,
      then the value of the object identifier referenced by the id parameter
      shall be unchanged.
  - name: TooMany
    test-code: |
      T_rsc( ctx->status, RTEMS_TOO_MANY );
      T_eq_u32( ctx->id_value, 0xffffffff );
    text: |
      The status shall be RTEMS_TOO_MANY.  If the id parameter is not NULL,
      then the value of the object identifier referenced by the id parameter
      shall be unchanged.
  - name: Unsatisfied
    test-code: |
      T_rsc( ctx->status, RTEMS_UNSATISFIED  );
      T_eq_u32( ctx->id_value, 0xffffffff );
    text: |
      The status shall be RTEMS_UNSATISFIED.  If the id parameter is not NULL,
      then the value of the object identifier referenced by the id parameter
      shall be unchanged.
  test-epilogue: null
  test-prologue: |
    rtems_status_code sc;
pre-conditions:
- name: Id
  states:
  - name: Id
    test-code: |
      ctx->id = &ctx->id_value;
    text: |
      The id parameter shall reference an object identifier value.
  - name: 'Null'
    test-code: |
      ctx->id = NULL;
    text: |
      The id parameter shall be NULL.
  test-epilogue: null
  test-prologue: null
- name: Name
  states:
  - name: Valid
    test-code: |
      ctx->config.name = rtems_build_name( 'N', 'A', 'M', 'E' );
    text: |
      The name of the task configuration shall be valid.
  - name: Inv
    test-code: |
      ctx->config.name = 0;
    text: |
      The name of the task configuration shall be invalid.
  test-epilogue: null
  test-prologue: null
- name: Prio
  states:
  - name: Valid
    test-code: |
      ctx->config.initial_priority = 254;
    text: |
      The initial priority of the task configuration shall be valid.
  - name: Zero
    test-code: |
      ctx->config.initial_priority = 0;
    text: |
      The initial priority of the task configuration shall be zero.
  - name: Inv
    test-code: |
      ctx->config.initial_priority = 0xffffffff;
    text: |
      The initial priority of the task configuration shall be invalid.
  test-epilogue: null
  test-prologue: null
- name: Tasks
  states:
  - name: Avail
    test-code: |
      /* Nothing to do */
    text: |
      There shall be at least one inactive task object available.
  - name: None
    test-code: |
      create_extension_status = ctx->create_extension_status;
      ctx->create_extension_status = true;

      while ( true ) {
        rtems_status_code sc;
        rtems_id id;

        sc = rtems_task_construct( &valid_task_config, &id );

        if ( sc == RTEMS_SUCCESSFUL ) {
          Objects_Control           *obj;
          const Objects_Information *info;

          info = _Objects_Get_information_id( id );
          T_quiet_assert_not_null( info );
          obj = _Objects_Get_no_protection( id, info );
          T_quiet_assert_not_null( obj );
          _Chain_Append_unprotected( &ctx->tasks, &obj->Node );
        } else {
          T_quiet_rsc( sc, RTEMS_TOO_MANY );
          break;
        }
      }

      ctx->create_extension_status = create_extension_status;
    text: |
      There shall be no inactive task object available.
  test-epilogue: null
  test-prologue: |
    bool create_extension_status;
- name: TLS
  states:
  - name: Enough
    test-code: |
      ctx->config.maximum_thread_local_storage_size = MAX_TLS_SIZE;
    text: |
      The maximum thread-local storage size of the task configuration shall be
      greater than or equal to the thread-local storage size.
  - name: Small
    test-code: |
      ctx->config.maximum_thread_local_storage_size = 0;
    text: |
      The maximum thread-local storage size of the task configuration shall be
      less than the thread-local storage size.
  test-epilogue: null
  test-prologue: null
- name: Stack
  states:
  - name: Enough
    test-code: |
      ctx->stack_size = RTEMS_MINIMUM_STACK_SIZE;
    text: |
      The task stack size of the task configuration shall be greater than or
      equal to the configured minimum size.
  - name: Small
    test-code: |
      ctx->stack_size = 0;
    text: |
      The task stack size of the task configuration shall be less than to the
      configured minimum size.
  test-epilogue: null
  test-prologue: null
- name: Ext
  states:
  - name: Ok
    test-code: |
      ctx->create_extension_status = true;
    text: |
      None of the task create extensions shall fail.
  - name: Err
    test-code: |
      ctx->create_extension_status = false;
    text: |
      At least one of the task create extensions shall fail.
  test-epilogue: null
  test-prologue: null
- name: Preempt
  states:
  - name: 'Yes'
    test-code: |
      ctx->config.initial_modes &= ~RTEMS_PREEMPT_MASK;
      ctx->config.initial_modes |= RTEMS_PREEMPT;
    text: |
      The preemptible mode in the initial modes of the task configuration shall
      be set to preemptible.
  - name: 'No'
    test-code: |
      ctx->config.initial_modes &= ~RTEMS_PREEMPT_MASK;
      ctx->config.initial_modes |= RTEMS_NO_PREEMPT;
    text: |
      The preemptible mode in the initial modes of the task configuration shall
      be set to non-preemptible.
  test-epilogue: null
  test-prologue: null
rationale: null
references: []
requirement-type: functional
skip-reasons: {}
test-action: |
  ctx->config.storage_size = RTEMS_TASK_STORAGE_SIZE(
    ctx->config.maximum_thread_local_storage_size + ctx->stack_size,
    ctx->config.attributes
  );
  ctx->status = rtems_task_construct( &ctx->config, ctx->id );
test-brief: null
test-cleanup: |
  Chain_Node *node;

  while ( ( node = _Chain_Get_unprotected( &ctx->tasks ) ) ) {
    Objects_Control   *obj;
    rtems_status_code  sc;

    obj = (Objects_Control *) node;
    sc = rtems_task_delete( obj->id );
    T_quiet_rsc_success( sc );
  }
test-context:
- brief: null
  description: null
  member: rtems_status_code status
- brief: null
  description: null
  member: rtems_task_config config
- brief: null
  description: null
  member: rtems_id *id
- brief: null
  description: null
  member: rtems_id id_value
- brief: null
  description: null
  member: bool create_extension_status
- brief: null
  description: null
  member: size_t stack_size
- brief: null
  description: null
  member: rtems_id extension_id
- brief: null
  description: null
  member: Chain_Control tasks
test-context-support: null
test-description: null
test-header: null
test-includes:
- rtems.h
- rtems/score/chainimpl.h
- rtems/score/objectimpl.h
- string.h
test-local-includes: []
test-prepare: |
  ctx->id_value = 0xffffffff;
  memset( &ctx->config, 0, sizeof( ctx->config ) );
test-setup:
  brief: null
  code: |
    rtems_status_code sc;
    int var;

    var = tls_variable;
    RTEMS_OBFUSCATE_VARIABLE( var );
    tls_variable = var;

    sc = rtems_extension_create(
      rtems_build_name( 'T', 'C', 'F', 'C' ),
      &extensions,
      &ctx->extension_id
    );
    T_rsc_success( sc );

    _Chain_Initialize_empty( &ctx->tasks );
  description: null
test-stop: null
test-support: |
  static _Thread_local int tls_variable;

  #define MAX_TLS_SIZE RTEMS_ALIGN_UP( 128, RTEMS_TASK_STORAGE_ALIGNMENT )

  RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char task_storage[
    RTEMS_TASK_STORAGE_SIZE(
      MAX_TLS_SIZE + RTEMS_MINIMUM_STACK_SIZE,
      RTEMS_FLOATING_POINT
    )
  ];

  static const rtems_task_config valid_task_config = {
    .name = rtems_build_name( 'T', 'A', 'S', 'K' ),
    .initial_priority = 1,
    .storage_area = task_storage,
    .storage_size = sizeof( task_storage ),
    .maximum_thread_local_storage_size = MAX_TLS_SIZE,
    .initial_modes = RTEMS_DEFAULT_MODES,
    .attributes = RTEMS_DEFAULT_MODES
  };

  static bool ThreadCreate( rtems_tcb *executing, rtems_tcb *created )
  {
    (void) executing;
    (void) created;

    return RtemsTaskReqConstructErrors_Instance.create_extension_status;
  }

  static const rtems_extensions_table extensions = {
    .thread_create = ThreadCreate
  };
test-target: testsuites/validation/tc-task-construct-errors.c
test-teardown:
  brief: null
  code: |
    rtems_status_code sc;

    sc = rtems_extension_delete( ctx->extension_id );
    T_rsc_success( sc );
  description: null
text: ${.:text-template}
transition-map:
- enabled-by: true
  post-conditions:
    Status: Ok
  pre-conditions:
    Id:
    - Id
    Name:
    - Valid
    Prio:
    - Valid
    Tasks:
    - Avail
    TLS:
    - Enough
    Stack:
    - Enough
    Ext:
    - Ok
    Preempt: all
- enabled-by: true
  post-conditions:
    Status: InvAddress
  pre-conditions:
    Id:
    - 'Null'
    Name: all
    Prio: all
    Tasks: all
    TLS: all
    Stack: all
    Ext: all
    Preempt: all
- enabled-by: true
  post-conditions:
    Status: InvName
  pre-conditions:
    Id:
    - Id
    Name:
    - Inv
    Prio: all
    Tasks: all
    TLS: all
    Stack: all
    Ext: all
    Preempt: all
- enabled-by: true
  post-conditions:
    Status: InvPrio
  pre-conditions:
    Id:
    - Id
    Name:
    - Valid
    Prio:
    - Zero
    - Inv
    Tasks: all
    TLS: all
    Stack: all
    Ext: all
    Preempt: all
- enabled-by: true
  post-conditions:
    Status: TooMany
  pre-conditions:
    Id:
    - Id
    Name:
    - Valid
    Prio:
    - Valid
    Tasks:
    - None
    TLS: all
    Stack: all
    Ext: all
    Preempt: all
- enabled-by: true
  post-conditions:
    Status: InvSize
  pre-conditions:
    Id:
    - Id
    Name:
    - Valid
    Prio:
    - Valid
    Tasks:
    - Avail
    TLS:
    - Small
    Stack: all
    Ext: all
    Preempt: all
- enabled-by: true
  post-conditions:
    Status: InvSize
  pre-conditions:
    Id:
    - Id
    Name:
    - Valid
    Prio:
    - Valid
    Tasks:
    - Avail
    TLS:
    - Enough
    Stack:
    - Small
    Ext: all
    Preempt: all
- enabled-by: true
  post-conditions:
    Status: Unsatisfied
  pre-conditions:
    Id:
    - Id
    Name:
    - Valid
    Prio:
    - Valid
    Tasks:
    - Avail
    TLS:
    - Enough
    Stack:
    - Enough
    Ext:
    - Err
    Preempt: all
- enabled-by: RTEMS_SMP
  post-conditions:
    Status: Unsatisfied
  pre-conditions:
    Id:
    - Id
    Name:
    - Valid
    Prio:
    - Valid
    Tasks:
    - Avail
    TLS:
    - Enough
    Stack:
    - Enough
    Ext:
    - Ok
    Preempt:
    - 'No'
type: requirement