dep-protobuf/python/google/protobuf/internal/any_test.py
Jakob Cornell fb78c09e16 Add constructing unpack routine to Python Protobuf Any API.
The main benefit here is enabling unpacking in an expression context whereas previously multiple statements were required. The return/raise API is also more idiomatic to Python than the current one using an out parameter and status return.

PiperOrigin-RevId: 731911306
2025-02-27 16:44:02 -08:00

62 lines
1.9 KiB
Python

# -*- 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 Any APIs."""
import unittest
from google.protobuf import any as proto_any
from google.protobuf import any_pb2
from google.protobuf import unittest_pb2
class AnyTest(unittest.TestCase):
def test_pack_unpack(self):
all_types = unittest_pb2.TestAllTypes()
any_msg = proto_any.pack(all_types)
all_descriptor = all_types.DESCRIPTOR
self.assertEqual(
any_msg.type_url, 'type.googleapis.com/%s' % all_descriptor.full_name
)
# Any can be successfully unpacked to the correct message type.
unpacked_message = unittest_pb2.TestAllTypes()
self.assertTrue(proto_any.unpack(any_msg, unpacked_message))
proto_any.unpack_as(any_msg, unittest_pb2.TestAllTypes)
# Any can't be unpacked to an incorrect message type.
self.assertFalse(
proto_any.unpack(any_msg, unittest_pb2.TestAllTypes.NestedMessage())
)
with self.assertRaises(TypeError) as catcher:
proto_any.unpack_as(any_msg, unittest_pb2.TestAllTypes.NestedMessage)
self.assertIn('Attempted to unpack', catcher.exception.args[0])
def test_type_name(self):
all_types = unittest_pb2.TestAllTypes()
any_msg = proto_any.pack(all_types)
self.assertEqual(
proto_any.type_name(any_msg), 'proto2_unittest.TestAllTypes'
)
def test_is_type(self):
all_types = unittest_pb2.TestAllTypes()
any_msg = proto_any.pack(all_types)
all_descriptor = all_types.DESCRIPTOR
self.assertTrue(proto_any.is_type(any_msg, all_descriptor))
empty_any = any_pb2.Any()
self.assertFalse(proto_any.is_type(empty_any, all_descriptor))
if __name__ == '__main__':
unittest.main()