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: IdVar states: - name: Set test-code: | T_eq_ptr( ctx->id, &ctx->id_value ); T_ne_u32( ctx->id_value, INVALID_ID ); text: | The value of the object referenced by the ${../if/create:/params[5]/name} parameter shall be set to the object identifier of the created task after the return of the ${../if/create:/name} call. - name: Nop test-code: | T_eq_u32( ctx->id_value, INVALID_ID ); text: | Objects referenced by the ${../if/create:/params[5]/name} parameter in past calls to ${../if/create:/name} shall not be accessed 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: Name states: - name: Valid test-code: | ctx->name = NAME; text: | While the ${../if/create:/params[0]/name} parameter is valid. - name: Inv test-code: | ctx->name = 0; text: | While the ${../if/create:/params[0]/name} parameter is invalid. test-epilogue: null test-prologue: null - name: Id states: - name: Valid test-code: | ctx->id = &ctx->id_value; text: | While the ${../if/create:/params[5]/name} parameter references an object of type ${../../type/if/id:/name}. - name: 'Null' test-code: | ctx->id = NULL; text: | While the ${../if/create:/params[5]/name} parameter is ${/c/if/null:/name}. test-epilogue: null test-prologue: null - name: SysTsk states: - name: 'Yes' test-code: | ctx->attributes = RTEMS_SYSTEM_TASK; text: | While the ${../if/create:/params[4]/name} parameter specifies a system task. - name: 'No' test-code: | ctx->attributes = RTEMS_DEFAULT_ATTRIBUTES; text: | While the ${../if/create:/params[4]/name} parameter specifies an application task. test-epilogue: null test-prologue: null - name: Prio states: - name: Valid test-code: | ctx->initial_priority = RTEMS_MAXIMUM_PRIORITY - 1; text: | While the ${../if/create:/params[1]/name} parameter is valid and non-zero. - name: Zero test-code: | ctx->initial_priority = 0; text: | While the ${../if/create:/params[1]/name} parameter is zero. - name: Inv test-code: | ctx->initial_priority = 0xffffffff; text: | While the ${../if/create:/params[1]/name} parameter is invalid. test-epilogue: null test-prologue: null - name: Free states: - name: 'Yes' test-code: | /* Nothing to do */ text: | While the system has at least one inactive task object available. - name: 'No' test-code: | ctx->seized_objects = T_seize_objects( Create, ctx ); text: | While the system has 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: | While the ${../if/create:/params[1]/name} parameter is greater than or equal to the configured minimum size and less than or equal to the maximum stack size which can be allocated by the system. - name: Small test-code: | ctx->stack_size = 0; text: | While the ${../if/create:/params[1]/name} parameter is less than the configured minimum size. - name: Huge test-code: | ctx->stack_size = SIZE_MAX; text: | While the ${../if/create:/params[1]/name} parameter is 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: | While none of the task create extensions fails. - name: Err test-code: | ctx->create_extension_status = false; text: | While at least one of the task create extensions fails. 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: - tx-support.h 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' ) typedef ${.:/test-context-type} 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 IdVar: Set 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 IdVar: Set 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 IdVar: Nop 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 IdVar: Nop 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 IdVar: Nop 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 IdVar: Nop 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 IdVar: Nop 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 IdVar: Nop 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 IdVar: Nop 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 IdVar: Nop 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 IdVar: Nop 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 IdVar: Nop CreateExt: 'Yes' DelExt: 'Yes' pre-conditions: Ext: - Err Id: - Valid Name: - Valid SysTsk: - 'Yes' Prio: - Zero Stack: - Normal - Small Free: - 'Yes' type: requirement