blob: 6a1e886098c87fcd04a0f9d785a8cac9e7dadaee [file] [log] [blame]
# -*- coding: utf-8 -*-
# Protocol Buffers - Google's data interchange format
# Copyright 2008 Google Inc. All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
"""Tests proto Timestamp APIs."""
import datetime
import unittest
from google.protobuf import timestamp
from google.protobuf.internal import testing_refleaks
from google.protobuf.internal import well_known_types_test_pb2
from google.protobuf import timestamp_pb2
@testing_refleaks.TestCase
class TimestampTest(unittest.TestCase):
def test_timestamp_integer_conversion(self):
self.assertEqual(1, timestamp.to_nanoseconds(timestamp.from_nanoseconds(1)))
self.assertEqual(-1, timestamp.to_seconds(timestamp.from_seconds(-1)))
self.assertEqual(
123, timestamp.to_milliseconds(timestamp.from_milliseconds(123))
)
self.assertEqual(
321, timestamp.to_microseconds(timestamp.from_microseconds(321))
)
def test_timestamp_current(self):
# It is not easy to check with current time. For test coverage only.
self.assertNotEqual(8 * 3600, timestamp.from_current_time().seconds)
def test_timestamp_json(self):
def check_timestamp(ts, text):
self.assertEqual(text, timestamp.to_json_string(ts))
parsed_ts = timestamp.from_json_string(text)
self.assertEqual(ts, parsed_ts)
message = timestamp_pb2.Timestamp()
message.seconds = 0
message.nanos = 0
check_timestamp(message, '1970-01-01T00:00:00Z')
message.nanos = 10000000
check_timestamp(message, '1970-01-01T00:00:00.010Z')
message.nanos = 10000
check_timestamp(message, '1970-01-01T00:00:00.000010Z')
def test_timestamp_datetime(self):
naive_utc_epoch = datetime.datetime(1970, 1, 1)
message = well_known_types_test_pb2.WKTMessage()
message.optional_timestamp = naive_utc_epoch
self.assertEqual(0, message.optional_timestamp.seconds) # pytype: disable=attribute-error
self.assertEqual(0, message.optional_timestamp.nanos) # pytype: disable=attribute-error
self.assertEqual(
naive_utc_epoch, timestamp.to_datetime(message.optional_timestamp) # pytype: disable=wrong-arg-types
)
def test_timstamp_construction(self):
message = well_known_types_test_pb2.WKTMessage(
optional_timestamp=datetime.datetime.today()
)
def test_repeated_timestamp_construction(self):
message = well_known_types_test_pb2.WKTMessage(
repeated_ts=[
datetime.datetime(2025, 1, 1),
datetime.datetime(1970, 1, 1),
timestamp_pb2.Timestamp(),
]
)
self.assertEqual(len(message.repeated_ts), 3)
self.assertEqual(
datetime.datetime(2025, 1, 1),
timestamp.to_datetime((message.repeated_ts[0])),
)
self.assertEqual(
datetime.datetime(1970, 1, 1),
timestamp.to_datetime((message.repeated_ts[1])),
)
self.assertEqual(timestamp_pb2.Timestamp(), message.repeated_ts[2])
def test_timestamp_sub_annotation(self):
t1 = timestamp_pb2.Timestamp()
t2 = timestamp_pb2.Timestamp()
dt = datetime.datetime.now()
td = datetime.timedelta(hours=0)
msg = well_known_types_test_pb2.WKTMessage(optional_duration=td)
# Timestamp - datetime
self.assertEqual(t1 - dt, t2 - dt)
# Timestamp - Timestamp
self.assertEqual(t1 - t2, t2 - t1)
# datetime - Timestamp
self.assertEqual(dt - t1, dt - t2)
# Timestamp - timedelta and Timestamp - Duration
self.assertEqual(t1 - td, t2 - msg.optional_duration)
def test_timestamp_add_annotation(self):
ts = timestamp_pb2.Timestamp()
td = datetime.timedelta(hours=0)
msg = well_known_types_test_pb2.WKTMessage(optional_duration=td)
# Timestamp + timedelta and timedelta + Timestamp
self.assertEqual(ts + td, td + ts)
# Timestamp + Duration and Duration + Timestamp
self.assertEqual(ts + msg.optional_duration, msg.optional_duration + ts)
def test_assign_duration_to_timestamp(self):
message = well_known_types_test_pb2.WKTMessage()
with self.assertRaises((TypeError)):
message.optional_timestamp = datetime.timedelta(microseconds=123)
if __name__ == '__main__':
unittest.main()