diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-02-26 12:17:25 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-02-26 14:36:09 +0100 |
commit | 9184ea1cd77a1d38d1a40328ebbc0faa75494b5e (patch) | |
tree | a96f4050809fbd1e1edfd3237981916516ec5d81 /spec | |
parent | spec: Improve task construct validation (diff) | |
download | rtems-central-9184ea1cd77a1d38d1a40328ebbc0faa75494b5e.tar.bz2 |
spec: Specify task create errors
Diffstat (limited to 'spec')
-rw-r--r-- | spec/rtems/task/req/create-errors.yml | 639 |
1 files changed, 639 insertions, 0 deletions
diff --git a/spec/rtems/task/req/create-errors.yml b/spec/rtems/task/req/create-errors.yml new file mode 100644 index 00000000..c9d1bdeb --- /dev/null +++ b/spec/rtems/task/req/create-errors.yml @@ -0,0 +1,639 @@ +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause +copyrights: +- Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de) +enabled-by: true +functional-type: action +links: +- role: interface-function + uid: ../if/create +post-conditions: +- name: Status + states: + - name: Ok + test-code: | + T_rsc_success( ctx->status ); + text: | + The return status of ${../if/create:/name} shall be + ${../../status/if/successful:/name}. + - name: InvAddr + test-code: | + T_rsc( ctx->status, RTEMS_INVALID_ADDRESS ); + text: | + The return status of ${../if/create:/name} shall be + ${../../status/if/invalid-address:/name}. + - name: InvName + test-code: | + T_rsc( ctx->status, RTEMS_INVALID_NAME ); + text: | + The return status of ${../if/create:/name} shall be + ${../../status/if/invalid-name:/name}. + - name: InvPrio + test-code: | + T_rsc( ctx->status, RTEMS_INVALID_PRIORITY ); + text: | + The return status of ${../if/create:/name} shall be + ${../../status/if/invalid-priority:/name}. + - name: TooMany + test-code: | + T_rsc( ctx->status, RTEMS_TOO_MANY ); + text: | + The return status of ${../if/create:/name} shall be + ${../../status/if/too-many:/name}. + - name: Unsat + test-code: | + T_rsc( ctx->status, RTEMS_UNSATISFIED ); + text: | + The return status of ${../if/create:/name} shall be + ${../../status/if/unsatisfied:/name}. + test-epilogue: null + test-prologue: null +- name: Name + states: + - name: Valid + test-code: | + id = 0; + sc = rtems_task_ident( NAME, RTEMS_SEARCH_LOCAL_NODE, &id ); + T_rsc_success( sc ); + T_eq_u32( id, ctx->id_value ); + text: | + The unique object name shall identify the task created by + the ${../if/create:/name} call. + - name: Invalid + test-code: | + sc = rtems_task_ident( NAME, RTEMS_SEARCH_LOCAL_NODE, &id ); + T_rsc( sc, RTEMS_INVALID_NAME ); + text: | + The unique object name shall not identify a task. + test-epilogue: null + test-prologue: | + rtems_status_code sc; + rtems_id id; +- name: IdValue + states: + - name: Assigned + test-code: | + T_eq_ptr( ctx->id, &ctx->id_value ); + T_ne_u32( ctx->id_value, INVALID_ID ); + text: | + The value of the object identifier variable shall be equal to the object + identifier of the task created by the ${../if/create:/name} call. + - name: Unchanged + test-code: | + T_eq_u32( ctx->id_value, INVALID_ID ); + text: | + The value of the object identifier variable shall be unchanged by the + ${../if/create:/name} call. + test-epilogue: null + test-prologue: null +- name: CreateExt + states: + - name: 'Yes' + test-code: | + T_eq_u32( ctx->create_extension_calls, 1 ); + text: | + The create user extensions shall be invoked during the + ${../if/create:/name} call. + - name: 'No' + test-code: | + T_eq_u32( ctx->create_extension_calls, 0 ); + text: | + The create user extensions shall not be invoked during the + ${../if/create:/name} call. + test-epilogue: null + test-prologue: null +- name: DelExt + states: + - name: 'Yes' + test-code: | + T_eq_u32( ctx->delete_extension_calls, 1 ); + text: | + The delete user extensions shall be invoked during the + ${../if/create:/name} call. + - name: 'No' + test-code: | + T_eq_u32( ctx->delete_extension_calls, 0 ); + text: | + The delete user extensions shall not be invoked during the + ${../if/create:/name} call. + test-epilogue: null + test-prologue: null +pre-conditions: +- name: Id + states: + - name: Valid + 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->name = NAME; + text: | + The ${../if/create:/params[0]/name} parameter shall be valid. + - name: Inv + test-code: | + ctx->name = 0; + text: | + The ${../if/create:/params[0]/name} parameter shall be invalid. + test-epilogue: null + test-prologue: null +- name: SysTsk + states: + - name: 'Yes' + test-code: | + ctx->attributes = RTEMS_SYSTEM_TASK; + text: | + The ${../if/create:/params[4]/name} parameter shall specify a system + task. + - name: 'No' + test-code: | + ctx->attributes = RTEMS_DEFAULT_ATTRIBUTES; + text: | + The ${../if/create:/params[4]/name} parameter shall specify an + application task. + test-epilogue: null + test-prologue: null +- name: Prio + states: + - name: Valid + test-code: | + ctx->initial_priority = 254; + text: | + The ${../if/create:/params[1]/name} parameter shall be valid. + - name: Zero + test-code: | + ctx->initial_priority = 0; + text: | + The ${../if/create:/params[1]/name} parameter shall be zero. + - name: Inv + test-code: | + ctx->initial_priority = 0xffffffff; + text: | + The ${../if/create:/params[1]/name} parameter shall be invalid. + test-epilogue: null + test-prologue: null +- name: Free + states: + - name: 'Yes' + test-code: | + /* Nothing to do */ + text: | + The system shall have at least one inactive task object available. + - name: 'No' + test-code: | + ctx->seized_objects = T_seize_objects( Create, ctx ); + text: | + The system shall have no inactive task object available. + test-epilogue: null + test-prologue: null +- name: Stack + states: + - name: Normal + test-code: | + ctx->stack_size = RTEMS_MINIMUM_STACK_SIZE; + text: | + The ${../if/create:/params[1]/name} parameter shall be greater than or + equal to the configured minimum size. + - name: Small + test-code: | + ctx->stack_size = 0; + text: | + The ${../if/create:/params[1]/name} parameter shall be less than the + configured minimum size. + - name: Huge + test-code: | + ctx->stack_size = SIZE_MAX; + text: | + The ${../if/create:/params[1]/name} parameter shall be greater than the + maximum stack size which can be allocated by the system. + 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 +rationale: null +references: [] +requirement-type: functional +skip-reasons: {} +test-action: | + ctx->create_extension_calls = 0; + ctx->delete_extension_calls = 0; + ctx->status = rtems_task_create( + ctx->name, + ctx->initial_priority, + ctx->stack_size, + RTEMS_DEFAULT_MODES, + ctx->attributes, + ctx->id + ); +test-brief: null +test-cleanup: | + if ( ctx->id_value != INVALID_ID ) { + rtems_status_code sc; + + sc = rtems_task_delete( ctx->id_value ); + T_rsc_success( sc ); + + ctx->id_value = INVALID_ID; + } + + T_surrender_objects( &ctx->seized_objects, rtems_task_delete ); +test-context: +- brief: null + description: null + member: | + rtems_status_code status +- 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: | + uint32_t create_extension_calls +- brief: null + description: null + member: | + uint32_t delete_extension_calls +- brief: null + description: null + member: | + rtems_name name +- brief: null + description: null + member: | + rtems_task_priority initial_priority +- brief: null + description: null + member: | + size_t stack_size +- brief: null + description: null + member: | + rtems_attribute attributes +- brief: null + description: null + member: | + rtems_id extension_id +- brief: null + description: null + member: | + void *seized_objects +test-context-support: null +test-description: null +test-header: null +test-includes: +- rtems.h +- string.h +- rtems/score/apimutex.h +- rtems/score/threadimpl.h +test-local-includes: [] +test-prepare: | + _RTEMS_Lock_allocator(); + _Thread_Kill_zombies(); + _RTEMS_Unlock_allocator(); + + ctx->id_value = INVALID_ID; +test-setup: + brief: null + code: | + rtems_status_code sc; + + sc = rtems_extension_create( + rtems_build_name( 'T', 'E', 'X', 'T' ), + &extensions, + &ctx->extension_id + ); + T_rsc_success( sc ); + description: null +test-stop: null +test-support: | + #define NAME rtems_build_name( 'T', 'E', 'S', 'T' ) + + #define INVALID_ID 0xffffffff + + typedef RtemsTaskReqCreateErrors_Context Context; + + static rtems_status_code Create( void *arg, uint32_t *id ) + { + Context *ctx; + bool create_extension_status; + rtems_status_code sc; + + ctx = arg; + create_extension_status = ctx->create_extension_status; + ctx->create_extension_status = true; + sc = rtems_task_create( + rtems_build_name( 'S', 'I', 'Z', 'E' ), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + id + ); + ctx->create_extension_status = create_extension_status; + + return sc; + } + + static bool ThreadCreate( rtems_tcb *executing, rtems_tcb *created ) + { + (void) executing; + (void) created; + + ++RtemsTaskReqCreateErrors_Instance.create_extension_calls; + return RtemsTaskReqCreateErrors_Instance.create_extension_status; + } + + static void ThreadDelete( rtems_tcb *executing, rtems_tcb *deleted ) + { + (void) executing; + (void) deleted; + + ++RtemsTaskReqCreateErrors_Instance.delete_extension_calls; + } + + static const rtems_extensions_table extensions = { + .thread_create = ThreadCreate, + .thread_delete = ThreadDelete + }; +test-target: testsuites/validation/tc-task-create-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 + Name: Valid + IdValue: Assigned + CreateExt: 'Yes' + DelExt: 'No' + pre-conditions: + Ext: + - Ok + Id: + - Valid + Name: + - Valid + SysTsk: all + Prio: + - Valid + Stack: + - Normal + - Small + Free: + - 'Yes' +- enabled-by: true + post-conditions: + Status: Ok + Name: Valid + IdValue: Assigned + CreateExt: 'Yes' + DelExt: 'No' + pre-conditions: + Ext: + - Ok + Id: + - Valid + Name: + - Valid + SysTsk: + - 'Yes' + Prio: + - Zero + Stack: + - Normal + - Small + Free: + - 'Yes' +- enabled-by: true + post-conditions: + Status: InvName + Name: Invalid + IdValue: Unchanged + CreateExt: 'No' + DelExt: 'No' + pre-conditions: + Ext: all + Id: all + Name: + - Inv + SysTsk: all + Prio: all + Stack: all + Free: all +- enabled-by: true + post-conditions: + Status: InvAddr + Name: Invalid + IdValue: Unchanged + CreateExt: 'No' + DelExt: 'No' + pre-conditions: + Ext: all + Id: + - 'Null' + Name: + - Valid + SysTsk: all + Prio: all + Stack: all + Free: all +- enabled-by: true + post-conditions: + Status: InvPrio + Name: Invalid + IdValue: Unchanged + CreateExt: 'No' + DelExt: 'No' + pre-conditions: + Ext: all + Id: + - Valid + Name: + - Valid + SysTsk: all + Prio: + - Inv + Stack: all + Free: all +- enabled-by: true + post-conditions: + Status: InvPrio + Name: Invalid + IdValue: Unchanged + CreateExt: 'No' + DelExt: 'No' + pre-conditions: + Ext: all + Id: + - Valid + Name: + - Valid + SysTsk: + - 'No' + Prio: + - Zero + Stack: all + Free: all +- enabled-by: true + post-conditions: + Status: TooMany + Name: Invalid + IdValue: Unchanged + CreateExt: 'No' + DelExt: 'No' + pre-conditions: + Ext: all + Id: + - Valid + Name: + - Valid + SysTsk: all + Prio: + - Valid + Stack: all + Free: + - 'No' +- enabled-by: true + post-conditions: + Status: TooMany + Name: Invalid + IdValue: Unchanged + CreateExt: 'No' + DelExt: 'No' + pre-conditions: + Ext: all + Id: + - Valid + Name: + - Valid + SysTsk: + - 'Yes' + Prio: + - Zero + Stack: all + Free: + - 'No' +- enabled-by: true + post-conditions: + Status: Unsat + Name: Invalid + IdValue: Unchanged + CreateExt: 'No' + DelExt: 'No' + pre-conditions: + Ext: all + Id: + - Valid + Name: + - Valid + SysTsk: all + Prio: + - Valid + Stack: + - Huge + Free: + - 'Yes' +- enabled-by: true + post-conditions: + Status: Unsat + Name: Invalid + IdValue: Unchanged + CreateExt: 'No' + DelExt: 'No' + pre-conditions: + Ext: all + Id: + - Valid + Name: + - Valid + SysTsk: + - 'Yes' + Prio: + - Zero + Stack: + - Huge + Free: + - 'Yes' +- enabled-by: true + post-conditions: + Status: Unsat + Name: Invalid + IdValue: Unchanged + CreateExt: 'Yes' + DelExt: 'Yes' + pre-conditions: + Ext: + - Err + Id: + - Valid + Name: + - Valid + SysTsk: all + Prio: + - Valid + Stack: + - Normal + - Small + Free: + - 'Yes' +- enabled-by: true + post-conditions: + Status: Unsat + Name: Invalid + IdValue: Unchanged + CreateExt: 'Yes' + DelExt: 'Yes' + pre-conditions: + Ext: + - Err + Id: + - Valid + Name: + - Valid + SysTsk: + - 'Yes' + Prio: + - Zero + Stack: + - Normal + - Small + Free: + - 'Yes' +type: requirement |