summaryrefslogtreecommitdiffstats
path: root/spec/req/rtems/tasks/construct-errors.yml
diff options
context:
space:
mode:
Diffstat (limited to 'spec/req/rtems/tasks/construct-errors.yml')
-rw-r--r--spec/req/rtems/tasks/construct-errors.yml499
1 files changed, 499 insertions, 0 deletions
diff --git a/spec/req/rtems/tasks/construct-errors.yml b/spec/req/rtems/tasks/construct-errors.yml
new file mode 100644
index 00000000..2e24ac94
--- /dev/null
+++ b/spec/req/rtems/tasks/construct-errors.yml
@@ -0,0 +1,499 @@
+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/rtems/tasks/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 ReqRtemsTasksConstructErrors_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