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/get-tod
post-conditions:
- name: Status
states:
- name: Ok
test-code: |
T_rsc_success( ctx->set_tod_status );
T_rsc_success( ctx->get_tod_status );
text: |
The return status of ${../if/get-tod:/name} shall be
${../../status/if/successful:/name}
- name: InvAddr
test-code: |
T_rsc( ctx->get_tod_status, RTEMS_INVALID_ADDRESS );
text: |
The return status of ${../if/get-tod:/name} shall be
${../../status/if/invalid-address:/name}.
- name: NotDef
test-code: |
T_rsc( ctx->get_tod_status, RTEMS_NOT_DEFINED );
text: |
The return status of ${../if/get-tod:/name} shall be
${../../status/if/not-defined:/name}.
test-epilogue: null
test-prologue: null
- name: Value
states:
- name: TimeOfDay
test-code: |
T_eq_ptr( ctx->get_tod_ref, &ctx->get_tod_value );
T_eq_u32( ctx->get_tod_value.year, ctx->set_tod_value.year );
T_eq_u32( ctx->get_tod_value.month, ctx->set_tod_value.month );
T_eq_u32( ctx->get_tod_value.day, ctx->set_tod_value.day );
T_eq_u32( ctx->get_tod_value.hour, ctx->set_tod_value.hour );
T_eq_u32( ctx->get_tod_value.minute, ctx->set_tod_value.minute );
T_eq_u32( ctx->get_tod_value.second, ctx->set_tod_value.second );
T_ge_u32( ctx->get_tod_value.ticks, ctx->set_tod_value.ticks );
T_lt_u32( ctx->get_tod_value.ticks,
ctx->set_tod_value.ticks + ctx->grace_ticks );
text: |
The value of the object referenced by the
${../if/get-tod:/params[0]/name} parameter shall be set to the value
of the ${/glossary/clock-realtime:/term} at a point in time
during the call to ${../if/get-tod:/name}.
- name: Unchanged
test-code: |
T_eq_u32( ctx->get_tod_value.year, 1 );
T_eq_u32( ctx->get_tod_value.month, 1 );
T_eq_u32( ctx->get_tod_value.day, 1 );
T_eq_u32( ctx->get_tod_value.hour, 1 );
T_eq_u32( ctx->get_tod_value.minute, 1 );
T_eq_u32( ctx->get_tod_value.second, 1 );
T_eq_u32( ctx->get_tod_value.ticks, 1 );
text: |
Object referenced by the ${../if/get-tod:/params[0]/name} parameter
in past call to ${../if/get-tod:/name} shall not be modified
by the ${../if/get-tod:/name} call.
test-epilogue: null
test-prologue: null
pre-conditions:
- name: ToD
states:
- name: Arbitrary
test-code: |
ctx->set_tod_value =
(rtems_time_of_day) { 2023, 12, 27, 6, 7, 8,
rtems_clock_get_ticks_per_second() / 4 };
text: |
While the ${/glossary/clock-realtime:/term} indicates an
arbitrary valid date and time between 1988-01-01T00:00:00.000000000Z and
2514-05-30T01:53:03.999999999Z.
- name: Leap4
test-code: |
ctx->set_tod_value =
(rtems_time_of_day) { 2096, 2, 29, 0, 0, 0, 0 };
text: |
While the ${/glossary/clock-realtime:/term} indicates a
date for a leap year with the value of 29th of February.
- name: Leap100
test-code: |
ctx->set_tod_value =
(rtems_time_of_day) { 2100, 2, 28, 23, 59, 59,
rtems_clock_get_ticks_per_second() - ctx->grace_ticks };
text: |
While the ${/glossary/clock-realtime:/term} indicates a
date for a non-leap year with the value of 28th of February.
- name: Leap400
test-code: |
ctx->set_tod_value =
(rtems_time_of_day) { 2000, 2, 29, 0, 0, 0, 0 };
text: |
While the ${/glossary/clock-realtime:/term} indicates a
date for a leap year with the value of 29th of February.
- name: Youngest
test-code: |
ctx->set_tod_value =
(rtems_time_of_day) { 1988, 1, 1, 0, 0, 0, 0 };
text: |
While the ${/glossary/clock-realtime:/term} indicates the
youngest date and time accepted (1988-01-01T00:00:00.000000000Z).
- name: Oldest
test-code: |
ctx->set_tod_value =
(rtems_time_of_day) { 2105, 12, 31, 23, 59, 59,
rtems_clock_get_ticks_per_second() - ctx->grace_ticks };
text: |
While the ${/glossary/clock-realtime:/term} indicates the
oldest date and time accepted (2105-12-31T23:59:59.999999999Z).
- name: NotSet
test-code: |
ctx->isDef = false;
text: |
While the ${/glossary/clock-realtime:/term} has not been set before.
test-epilogue: null
test-prologue: null
- name: Param
states:
- name: Valid
test-code: |
ctx->get_tod_ref = &ctx->get_tod_value;
text: |
While the ${../if/get-tod:/params[0]/name} parameter references an
object of type ${../../type/if/time-of-day:/name}.
- name: 'Null'
test-code: |
ctx->get_tod_ref = NULL;
text: |
While the ${../if/get-tod:/params[0]/name} parameter is
${/c/if/null:/name}.
test-epilogue: null
test-prologue: null
rationale: null
references: []
requirement-type: functional
skip-reasons: {}
test-action: |
if ( ctx->isDef ) {
ctx->set_tod_status = rtems_clock_set( &ctx->set_tod_value );
ctx->get_tod_status = rtems_clock_get_tod( ctx->get_tod_ref );
} else {
ctx->get_tod_status = get_tod_before_set_tod( ctx->get_tod_ref );
}
test-brief: null
test-cleanup: null
test-context:
- brief: null
description: null
member: rtems_status_code set_tod_status
- brief: null
description: null
member: rtems_time_of_day set_tod_value
- brief: null
description: null
member: rtems_time_of_day *get_tod_ref
- brief: null
description: null
member: rtems_time_of_day get_tod_value
- brief: null
description: null
member: rtems_status_code get_tod_status
- brief: Grace period in tick which may be passed between set and get ToD.
description: null
member: uint32_t grace_ticks
- brief: null
description: null
member: bool isDef
test-context-support: null
test-description: null
test-header: null
test-includes:
- rtems.h
test-local-includes:
- tc-clock-get-tod.h
test-prepare: |
ctx->get_tod_value = (rtems_time_of_day) { 1, 1, 1, 1, 1, 1, 1 };
ctx->get_tod_ref = &ctx->get_tod_value;
ctx->set_tod_value = (rtems_time_of_day) { 2023, 4, 5, 6, 7, 8, 0 };
ctx->isDef = true;
test-setup:
brief: null
code: |
/* Call rtems_clock_get_tod() once before rtems_clock_set() gets called */
get_tod_before_set_tod( NULL );
ctx->grace_ticks = rtems_clock_get_ticks_per_second() * GRACE_PERIOD / 1000;
description: null
test-stop: null
test-support: |
rtems_status_code get_tod_before_set_tod( rtems_time_of_day *time_of_day )
{
static rtems_time_of_day tod_buf = { 1, 1, 1, 1, 1, 1, 1 };
static rtems_status_code status;
static bool has_been_called = false;
if ( ! has_been_called ) {
status = rtems_clock_get_tod( &tod_buf );
has_been_called = true;
}
if ( NULL != time_of_day ) {
*time_of_day = tod_buf;
}
return status;
}
/*
* How much time may pass between a call to rtems_clock_set() and
* a follow up call to rtems_clock_get_tod() in milliseconds?
*/
#define GRACE_PERIOD 5
test-target: testsuites/validation/tc-clock-get-tod.c
test-teardown: null
text: ${.:text-template}
transition-map:
- enabled-by: true
post-conditions:
Status: Ok
Value: TimeOfDay
pre-conditions:
ToD:
- Arbitrary
- Leap4
- Leap100
- Leap400
- Youngest
- Oldest
Param:
- Valid
- enabled-by: true
post-conditions:
Status: InvAddr
Value: Unchanged
pre-conditions:
ToD:
- Arbitrary
- Leap4
- Leap100
- Leap400
- Youngest
- Oldest
Param:
- 'Null'
- enabled-by: true
post-conditions:
Status: NotDef
Value: Unchanged
pre-conditions:
ToD:
- NotSet
Param:
- Valid
- 'Null'
type: requirement