#!/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()