summaryrefslogblamecommitdiffstats
path: root/spec/rtems/clock/req/get-tod.yml
blob: db64fcb88c171b21a5617512d4e28328bacbdbd5 (plain) (tree)




































































































































































































































































                                                                                
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