blob: 3c0df48f3c2400e7755501a2c47b060ace4f39a0 [file] [log] [blame]
Joshua Habermanda647532021-08-18 15:30:03 -07001# Copyright (c) 2009-2021, Google LLC
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are met:
6# * Redistributions of source code must retain the above copyright
7# notice, this list of conditions and the following disclaimer.
8# * Redistributions in binary form must reproduce the above copyright
9# notice, this list of conditions and the following disclaimer in the
10# documentation and/or other materials provided with the distribution.
11# * Neither the name of Google LLC nor the
12# names of its contributors may be used to endorse or promote products
13# derived from this software without specific prior written permission.
14#
15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18# DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY
19# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26
Joshua Habermancdc9fcd2021-08-23 16:57:40 -070027"""A bare-bones unit test that doesn't load any generated code."""
Joshua Habermana086aaf2021-08-18 15:10:06 -070028
29
30import unittest
31from google.protobuf.pyext import _message
Joshua Haberman2eb973f2022-05-03 16:50:23 -070032from google3.net.proto2.python.internal import api_implementation
Joshua Haberman5f0978a2021-12-28 16:52:43 -080033from google.protobuf import unittest_pb2
Joshua Haberman54b775d2022-01-05 12:55:52 -080034from google.protobuf import map_unittest_pb2
Joshua Habermanb0f81592021-12-29 09:58:12 -080035from google.protobuf import descriptor_pool
Joshua Haberman14372452021-12-31 12:02:36 -080036from google.protobuf import text_format
37from google.protobuf import message_factory
38from google.protobuf import message
Joshua Haberman2eb973f2022-05-03 16:50:23 -070039from google3.net.proto2.python.internal import factory_test1_pb2
40from google3.net.proto2.python.internal import factory_test2_pb2
41from google3.net.proto2.python.internal import more_extensions_pb2
Joshua Habermanb0f81592021-12-29 09:58:12 -080042from google.protobuf import descriptor_pb2
Joshua Habermana086aaf2021-08-18 15:10:06 -070043
44class TestMessageExtension(unittest.TestCase):
45
46 def test_descriptor_pool(self):
47 serialized_desc = b'\n\ntest.proto\"\x0e\n\x02M1*\x08\x08\x01\x10\x80\x80\x80\x80\x02:\x15\n\x08test_ext\x12\x03.M1\x18\x01 \x01(\x05'
48 pool = _message.DescriptorPool()
49 file_desc = pool.AddSerializedFile(serialized_desc)
50 self.assertEqual("test.proto", file_desc.name)
51 ext_desc = pool.FindExtensionByName("test_ext")
52 self.assertEqual(1, ext_desc.number)
53
54 # Test object cache: repeatedly retrieving the same descriptor
55 # should result in the same object
56 self.assertIs(ext_desc, pool.FindExtensionByName("test_ext"))
57
58
59 def test_lib_is_upb(self):
60 # Ensure we are not pulling in a different protobuf library on the
61 # system.
Joshua Habermane079f1b2021-12-18 22:10:46 -080062 print(_message._IS_UPB)
Joshua Habermana086aaf2021-08-18 15:10:06 -070063 self.assertTrue(_message._IS_UPB)
Joshua Habermane079f1b2021-12-18 22:10:46 -080064 self.assertEqual(api_implementation.Type(), "cpp")
Joshua Habermana086aaf2021-08-18 15:10:06 -070065
Joshua Haberman5f0978a2021-12-28 16:52:43 -080066 def test_repeated_field_slice_delete(self):
67 def test_slice(start, end, step):
68 vals = list(range(20))
69 message = unittest_pb2.TestAllTypes(repeated_int32=vals)
70 del vals[start:end:step]
71 del message.repeated_int32[start:end:step]
72 self.assertEqual(vals, list(message.repeated_int32))
73 test_slice(3, 11, 1)
74 test_slice(3, 11, 2)
75 test_slice(3, 11, 3)
76 test_slice(11, 3, -1)
77 test_slice(11, 3, -2)
78 test_slice(11, 3, -3)
79 test_slice(10, 25, 4)
Joshua Haberman14372452021-12-31 12:02:36 -080080
81 def testExtensionsErrors(self):
82 msg = unittest_pb2.TestAllTypes()
83 self.assertRaises(AttributeError, getattr, msg, 'Extensions')
Joshua Haberman54b775d2022-01-05 12:55:52 -080084
85 def testClearStubMapField(self):
Joshua Habermane5d8d282022-01-05 15:47:59 -080086 msg = map_unittest_pb2.TestMapSubmessage()
87 int32_map = msg.test_map.map_int32_int32
88 msg.test_map.ClearField("map_int32_int32")
Joshua Haberman54b775d2022-01-05 12:55:52 -080089 int32_map[123] = 456
Joshua Habermane5d8d282022-01-05 15:47:59 -080090 self.assertEqual(0, msg.test_map.ByteSize())
Joshua Haberman54b775d2022-01-05 12:55:52 -080091
92 def testClearReifiedMapField(self):
93 msg = map_unittest_pb2.TestMap()
94 int32_map = msg.map_int32_int32
95 int32_map[123] = 456
96 msg.ClearField("map_int32_int32")
97 int32_map[111] = 222
98 self.assertEqual(0, msg.ByteSize())
99
100 def testClearStubRepeatedField(self):
Joshua Habermane5d8d282022-01-05 15:47:59 -0800101 msg = unittest_pb2.NestedTestAllTypes()
102 int32_array = msg.payload.repeated_int32
103 msg.payload.ClearField("repeated_int32")
Joshua Haberman54b775d2022-01-05 12:55:52 -0800104 int32_array.append(123)
Joshua Habermane5d8d282022-01-05 15:47:59 -0800105 self.assertEqual(0, msg.payload.ByteSize())
Joshua Haberman54b775d2022-01-05 12:55:52 -0800106
107 def testClearReifiedRepeatdField(self):
108 msg = unittest_pb2.TestAllTypes()
109 int32_array = msg.repeated_int32
110 int32_array.append(123)
111 self.assertNotEqual(0, msg.ByteSize())
112 msg.ClearField("repeated_int32")
113 int32_array.append(123)
114 self.assertEqual(0, msg.ByteSize())
Joshua Haberman5f0978a2021-12-28 16:52:43 -0800115
Joshua Haberman06d6f5c2022-01-17 15:38:25 -0800116 def testFloatPrinting(self):
117 message = unittest_pb2.TestAllTypes()
118 message.optional_float = -0.0
119 self.assertEqual(str(message), 'optional_float: -0\n')
Joshua Habermanb8736ae2021-12-13 12:51:10 -0800120
Joshua Haberman14372452021-12-31 12:02:36 -0800121class OversizeProtosTest(unittest.TestCase):
122 def setUp(self):
123 msg = unittest_pb2.NestedTestAllTypes()
124 m = msg
125 for i in range(101):
126 m = m.child
127 m.Clear()
128 self.p_serialized = msg.SerializeToString()
129
130 def testAssertOversizeProto(self):
131 from google.protobuf.pyext._message import SetAllowOversizeProtos
132 SetAllowOversizeProtos(False)
133 q = unittest_pb2.NestedTestAllTypes()
134 with self.assertRaises(message.DecodeError):
135 q.ParseFromString(self.p_serialized)
136 print(q)
137
138 def testSucceedOversizeProto(self):
139 from google.protobuf.pyext._message import SetAllowOversizeProtos
140 SetAllowOversizeProtos(True)
141 q = unittest_pb2.NestedTestAllTypes()
142 q.ParseFromString(self.p_serialized)
Joshua Habermana086aaf2021-08-18 15:10:06 -0700143
Joshua Haberman71bfff22022-01-09 11:22:53 -0800144 def testExtensionIter(self):
145 extendee_proto = more_extensions_pb2.ExtendedMessage()
146
147 extension_int32 = more_extensions_pb2.optional_int_extension
148 extendee_proto.Extensions[extension_int32] = 23
Joshua Habermancfeb1ad2022-01-09 22:44:31 -0800149
Joshua Haberman71bfff22022-01-09 11:22:53 -0800150 extension_repeated = more_extensions_pb2.repeated_int_extension
151 extendee_proto.Extensions[extension_repeated].append(11)
152
153 extension_msg = more_extensions_pb2.optional_message_extension
154 extendee_proto.Extensions[extension_msg].foreign_message_int = 56
Joshua Habermancfeb1ad2022-01-09 22:44:31 -0800155
Joshua Haberman71bfff22022-01-09 11:22:53 -0800156 # Set some normal fields.
157 extendee_proto.optional_int32 = 1
158 extendee_proto.repeated_string.append('hi')
Joshua Habermancfeb1ad2022-01-09 22:44:31 -0800159
Joshua Haberman71bfff22022-01-09 11:22:53 -0800160 expected = {
161 extension_int32: True,
162 extension_msg: True,
163 extension_repeated: True
164 }
165 count = 0
166 for item in extendee_proto.Extensions:
167 del expected[item]
168 self.assertIn(item, extendee_proto.Extensions)
169 count += 1
170 self.assertEqual(count, 3)
171 self.assertEqual(len(expected), 0)
Joshua Haberman8c256cc2022-01-10 10:00:10 -0800172
173 def testIsInitializedStub(self):
174 proto = unittest_pb2.TestRequiredForeign()
175 self.assertTrue(proto.IsInitialized())
176 self.assertFalse(proto.optional_message.IsInitialized())
177 errors = []
178 self.assertFalse(proto.optional_message.IsInitialized(errors))
179 self.assertEqual(['a', 'b', 'c'], errors)
180 self.assertRaises(message.EncodeError, proto.optional_message.SerializeToString)
Joshua Haberman917f4252022-01-09 23:23:36 -0800181
Joshua Habermana086aaf2021-08-18 15:10:06 -0700182if __name__ == '__main__':
Joshua Habermanb8736ae2021-12-13 12:51:10 -0800183 unittest.main(verbosity=2)