Specifications:

  • Traffic Light Controller Clock can be read with S0096

    Verify status 0096 current date and time

    1. Given the site is connected

    2. Request status

    3. Expect status response before timeout

    
    
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    # File 'spec/site/tlc/clock_spec.rb', line 22
    
    Validator::Site.connected do |task,supervisor,site|
            request_status_and_confirm site, "current date and time",
              { S0096: [
                :year,
                :month,
                :day,
                :hour,
                :minute,
                :second,
              ] }
          end
  • Traffic Light Controller Clock can be set with M0104

    Verify that the controller responds to M0104

    1. Given the site is connected

    2. Send command

    3. Expect status response before timeout

    
    
    41
    42
    43
    44
    # File 'spec/site/tlc/clock_spec.rb', line 41
    
    Validator::Site.connected do |task,supervisor,site|
            prepare task, site
            set_clock(CLOCK)
          end
  • Traffic Light Controller Clock is used for S0096 status response

    Verify status S0096 clock after changing clock

    1. Given the site is connected

    2. Send control command to set_clock

    3. Request status S0096

    4. Compare set_clock and status timestamp

    5. Expect the difference to be within max_diff

    
    
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    # File 'spec/site/tlc/clock_spec.rb', line 55
    
    Validator::Site.connected do |task,supervisor,site|
            prepare task, site
            site.with_watchdog_disabled do  # avoid time synchronization by disabling watchdogs
              with_clock_set site, CLOCK do
                status_list = { S0096: [
                  :year,
                  :month,
                  :day,
                  :hour,
                  :minute,
                  :second,
                ] }
                result = site.request_status Validator.get_config('main_component'), convert_status_list(status_list), collect!: {
                  timeout: Validator.get_config('timeouts','status_update')
                }
                collector = result[:collector]
                status = status_list.keys.first.to_s
    
                received = Time.new(
                  collector.matcher_result( {"sCI" => status, "n" => "year"} )['s'],
                  collector.matcher_result( {"sCI" => status, "n" => "month"} )['s'],
                  collector.matcher_result( {"sCI" => status, "n" => "day"} )['s'],
                  collector.matcher_result( {"sCI" => status, "n" => "hour"} )['s'],
                  collector.matcher_result( {"sCI" => status, "n" => "minute"} )['s'],
                  collector.matcher_result( {"sCI" => status, "n" => "second"} )['s'],
                  'UTC'
                )
    
                max_diff =
                  Validator.get_config('timeouts','command_response') +
                  Validator.get_config('timeouts','status_response')
    
                diff = received - CLOCK
                diff = diff.round
                expect(diff.abs).to be <= max_diff,
                  "Clock reported by S0096 is off by #{diff}s, should be within #{max_diff}s"
              end
            end
          end
  • Traffic Light Controller Clock is used for S0096 response timestamp

    Verify status response timestamp after changing clock

    1. Given the site is connected

    2. Send control command to set_clock

    3. Request status S0096

    4. Compare set_clock and response timestamp

    5. Expect the difference to be within max_diff

    
    
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    # File 'spec/site/tlc/clock_spec.rb', line 104
    
    Validator::Site.connected do |task,supervisor,site|
            prepare task, site
            site.with_watchdog_disabled do  # avoid time synchronization by disabling watchdogs
              with_clock_set site, CLOCK do
                status_list = { S0096: [
                  :year,
                  :month,
                  :day,
                  :hour,
                  :minute,
                  :second,
                ] }
    
                result = site.request_status Validator.get_config('main_component'),
                  convert_status_list(status_list),
                  collect!: {
                    timeout: Validator.get_config('timeouts','status_response')
                  }
                collector = result[:collector]
    
                max_diff = Validator.get_config('timeouts','command_response') + Validator.get_config('timeouts','status_response')
                diff = Time.parse(collector.messages.first.attributes['sTs']) - CLOCK
                diff = diff.round
                expect(diff.abs).to be <= max_diff,
                  "Timestamp of S0096 is off by #{diff}s, should be within #{max_diff}s"
              end
            end
          end
  • Traffic Light Controller Clock is used for aggregated status timestamp

    Verify aggregated status response timestamp after changing clock

    1. Given the site is connected

    2. Send control command to set clock

    3. Wait for status = true

    4. Request aggregated status

    5. Compare set_clock and response timestamp

    6. Expect the difference to be within max_diff

    
    
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    # File 'spec/site/tlc/clock_spec.rb', line 143
    
    Validator::Site.connected do |task,supervisor,site|
            prepare task, site
            site.with_watchdog_disabled do  # avoid time synchronization by disabling watchdogs
              with_clock_set site, CLOCK do
                result = site.request_aggregated_status Validator.get_config('main_component'), collect!: {
                  timeout: Validator.get_config('timeouts','status_response')
                }
                collector = result[:collector]
                max_diff = Validator.get_config('timeouts','command_response') + Validator.get_config('timeouts','status_response')
                diff = Time.parse(collector.messages.first.attributes['aSTS']) - CLOCK
                diff = diff.round
                expect(diff.abs).to be <= max_diff,
                  "Timestamp of aggregated status is off by #{diff}s, should be within #{max_diff}s"
              end
            end
          end
  • Traffic Light Controller Clock is used for M0001 response timestamp

    Verify command response timestamp after changing clock

    1. Given the site is connected

    2. Send control command to set clock

    3. Send command to set functional position

    4. Compare set_clock and response timestamp

    5. Expect the difference to be within max_diff

    
    
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    # File 'spec/site/tlc/clock_spec.rb', line 169
    
    Validator::Site.connected do |task,supervisor,site|
            prepare task, site
            site.with_watchdog_disabled do  # avoid time synchronization by disabling watchdogs
              with_clock_set site, CLOCK do
                result = set_functional_position 'NormalControl'
                collector = result[:collector]
                max_diff = Validator.get_config('timeouts','command_response') * 2
                diff = Time.parse(collector.messages.first.attributes['cTS']) - CLOCK
                diff = diff.round
                expect(diff.abs).to be <= max_diff,
                  "Timestamp of command response is off by #{diff}s, should be within #{max_diff}s"
              end
            end
          end
  • Traffic Light Controller Clock is used for M0104 response timestamp

    Verify command response timestamp after changing clock

    1. Given the site is connected

    2. Send control command to set clock

    3. Send command to set functional position

    4. Compare set_clock and response timestamp

    5. Expect the difference to be within max_diff

    
    
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    # File 'spec/site/tlc/clock_spec.rb', line 193
    
    Validator::Site.connected do |task,supervisor,site|
            prepare task, site
            site.with_watchdog_disabled do  # avoid time synchronization by disabling watchdogs
              with_clock_set site, CLOCK do
                result = set_functional_position 'NormalControl'
                collector = result[:collector]
                max_diff = Validator.get_config('timeouts','command_response')
                diff = Time.parse(collector.messages.first.attributes['cTS']) - CLOCK
                diff = diff.round
                expect(diff.abs).to be <= max_diff,
                  "Timestamp of command response is off by #{diff}s, should be within #{max_diff}s"
              end
            end
          end
  • Traffic Light Controller Clock is used for alarm timestamp

    Verify timestamp of alarm after changing clock The test requires the device to be programmed so that a A0302 alarm can be raise by activating a specific input, as configuted in the test config.

    1. Given the site is connected

    2. When we send a command to change the clock

    3. And we raise an alarm, by acticate an input

    4. Then we should receive an alarm

    5. And the alarm timestamp should be close to the time set the clock to

    
    
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    # File 'spec/site/tlc/clock_spec.rb', line 221
    
    Validator::Site.connected do |task,supervisor,site|
            prepare task, site
            site.with_watchdog_disabled do  # avoid time synchronization by disabling watchdogs
              with_clock_set site, CLOCK do                           # set clock
                with_alarm_activated(task, site, 'A0302') do |alarm|   # raise alarm, by activating input
                  alarm_time = Time.parse( alarm.attributes["aTs"] )
                  max_diff = Validator.get_config('timeouts','command_response') + Validator.get_config('timeouts','status_response')
                  diff = alarm_time - CLOCK
                  expect(diff.round.abs).to be <= max_diff,
                    "Timestamp of alarm is off by #{diff}s, should be within #{max_diff}s"
                end
              end
            end
          end
  • Traffic Light Controller Clock is used for watchdog timestamp

    Verify timestamp of watchdog after changing clock

    1. Given the site is connected

    2. Send control command to setset_clock

    3. Wait for Watchdog

    4. Compare set_clock and alarm response timestamp

    5. Expect the difference to be within max_diff

    
    
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    # File 'spec/site/tlc/clock_spec.rb', line 245
    
    Validator::Site.connected do |task,supervisor,site|
            prepare task, site
            site.with_watchdog_disabled do  # avoid time synchronization by disabling watchdogs
              with_clock_set site, CLOCK do
                log "Checking watchdog timestamp"
                collector = RSMP::Collector.new site, task:task, type: "Watchdog", num: 1, timeout: Validator.get_config('timeouts','watchdog')
                collector.collect!
                max_diff = Validator.get_config('timeouts','command_response') + Validator.get_config('timeouts','status_response')
                diff = Time.parse(collector.messages.first.attributes['wTs']) - CLOCK
                diff = diff.round
                expect(diff.abs).to be <= max_diff,
                  "Timestamp of watchdog is off by #{diff}s, should be within #{max_diff}s"
              end
            end
          end