blob: 4b091eecc92c56f209e3c2d3cef659abb57db277 [file]
#!/usr/bin/env python3
# Copyright 2022 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Tests for the timestamp analyzer."""
import unittest
from pw_chrono.timestamp_analyzer import process_snapshot
from pw_chrono_protos import chrono_pb2
from pw_tokenizer import detokenize, tokens
class TimestampTest(unittest.TestCase):
"""Test for the timestamp analyzer."""
def test_no_timepoint(self):
snapshot = chrono_pb2.SnapshotTimestamps()
self.assertEqual(
'', str(process_snapshot(snapshot.SerializeToString()))
)
def test_timestamp_unknown_epoch_type(self):
snapshot = chrono_pb2.SnapshotTimestamps()
time_point = chrono_pb2.TimePoint(
timestamp=0,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=1,
epoch_type=chrono_pb2.EpochType.Enum.UNKNOWN,
),
)
snapshot.timestamps.append(time_point)
expected = '\n'.join(
(
'Snapshot capture timestamp',
' Timestamp (epoch UNKNOWN): 0 s',
'',
)
)
self.assertEqual(
expected, str(process_snapshot(snapshot.SerializeToString()))
)
def test_timestamp_with_time_since_boot(self):
snapshot = chrono_pb2.SnapshotTimestamps()
time_point = chrono_pb2.TimePoint(
timestamp=8640015,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=1000,
epoch_type=chrono_pb2.EpochType.Enum.TIME_SINCE_BOOT,
),
)
snapshot.timestamps.append(time_point)
expected = '\n'.join(
(
'Snapshot capture timestamp',
' Time since boot: 2:24:00.015000 (8640015 ms)',
'',
)
)
self.assertEqual(
expected, str(process_snapshot(snapshot.SerializeToString()))
)
def test_timestamp_with_utc_wall_clock(self):
snapshot = chrono_pb2.SnapshotTimestamps()
time_point = chrono_pb2.TimePoint(
timestamp=8640015,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=1000,
epoch_type=chrono_pb2.EpochType.Enum.UTC_WALL_CLOCK,
),
)
snapshot.timestamps.append(time_point)
expected = '\n'.join(
(
'Snapshot capture timestamp',
' UTC time: 1970-01-01 02:24:00.015000+00:00 (8640015 ms)',
'',
)
)
self.assertEqual(
expected, str(process_snapshot(snapshot.SerializeToString()))
)
def test_timestamp_with_name(self):
snapshot = chrono_pb2.SnapshotTimestamps()
time_point = chrono_pb2.TimePoint(
timestamp=51140716,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=1000000,
epoch_type=chrono_pb2.EpochType.Enum.UNKNOWN,
name='High resolution clock'.encode('utf-8'),
),
)
snapshot.timestamps.append(time_point)
expected = '\n'.join(
(
'Snapshot capture timestamp',
' High resolution clock (epoch UNKNOWN): 51140716 us',
'',
)
)
self.assertEqual(
expected, str(process_snapshot(snapshot.SerializeToString()))
)
def test_timestamp_with_tokenized_name(self):
token_db = tokens.Database(
[
tokens.TokenizedStringEntry(1, 'Peer device clock'),
]
)
detokenizer = detokenize.Detokenizer(token_db)
snapshot = chrono_pb2.SnapshotTimestamps()
time_point = chrono_pb2.TimePoint(
timestamp=51140716,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=1000000,
epoch_type=chrono_pb2.EpochType.Enum.UNKNOWN,
name=b'\x01\x00\x00\x00',
),
)
snapshot.timestamps.append(time_point)
expected = '\n'.join(
(
'Snapshot capture timestamp',
' Peer device clock (epoch UNKNOWN): 51140716 us',
'',
)
)
self.assertEqual(
expected,
str(process_snapshot(snapshot.SerializeToString(), detokenizer)),
)
def test_timestamp_with_tai_clock(self):
snapshot = chrono_pb2.SnapshotTimestamps()
time_point = chrono_pb2.TimePoint(
timestamp=1733882018,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=1000,
epoch_type=chrono_pb2.EpochType.Enum.TAI_WALL_CLOCK,
),
)
snapshot.timestamps.append(time_point)
expected = '\n'.join(
(
'Snapshot capture timestamp',
' Timestamp (epoch TAI_WALL_CLOCK): 1733882018 ms',
'',
)
)
self.assertEqual(
expected, str(process_snapshot(snapshot.SerializeToString()))
)
def test_timestamp_with_unrecognized_epoch(self):
snapshot = chrono_pb2.SnapshotTimestamps()
time_point = chrono_pb2.TimePoint(
timestamp=3424,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=1,
epoch_type=chrono_pb2.EpochType.Enum.ValueType(15),
),
)
snapshot.timestamps.append(time_point)
expected = '\n'.join(
(
'Snapshot capture timestamp',
' Timestamp (epoch 15): 3424 s',
'',
)
)
self.assertEqual(
expected, str(process_snapshot(snapshot.SerializeToString()))
)
def test_invalid_timestamp(self):
snapshot = chrono_pb2.SnapshotTimestamps()
time_point = chrono_pb2.TimePoint(
timestamp=1,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=0,
),
)
snapshot.timestamps.append(time_point)
expected = ''
self.assertEqual(
expected, str(process_snapshot(snapshot.SerializeToString()))
)
def test_no_timestamp(self):
snapshot = chrono_pb2.SnapshotTimestamps()
expected = ''
self.assertEqual(
expected, str(process_snapshot(snapshot.SerializeToString()))
)
def test_timestamp_with_time_since_boot_and_utc_wall_clock(self):
"""Test multiple timestamps."""
snapshot = chrono_pb2.SnapshotTimestamps()
time_point = chrono_pb2.TimePoint(
timestamp=8640000,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=1000,
epoch_type=chrono_pb2.EpochType.Enum.TIME_SINCE_BOOT,
),
)
snapshot.timestamps.append(time_point)
time_point = chrono_pb2.TimePoint(
timestamp=8640000,
clock_parameters=chrono_pb2.ClockParameters(
tick_period_seconds_numerator=1,
tick_period_seconds_denominator=1000,
epoch_type=chrono_pb2.EpochType.Enum.UTC_WALL_CLOCK,
),
)
snapshot.timestamps.append(time_point)
expected = '\n'.join(
(
'Snapshot capture timestamps',
' Time since boot: 2:24:00 (8640000 ms)',
' UTC time: 1970-01-01 02:24:00+00:00 (8640000 ms)',
'',
)
)
self.assertEqual(
expected, str(process_snapshot(snapshot.SerializeToString()))
)
if __name__ == '__main__':
unittest.main()