33 """Tests for google.protobuf.message_factory."""
35 __author__ =
'matthewtoia@google.com (Matt Toia)'
38 import unittest2
as unittest
52 @testing_refleaks.TestCase
57 factory_test1_pb2.DESCRIPTOR.serialized_pb)
59 factory_test2_pb2.DESCRIPTOR.serialized_pb)
64 msg.nested_factory_2_enum = 0
65 msg.nested_factory_2_message.value =
'nested message value'
66 msg.factory_1_message.factory_1_enum = 1
67 msg.factory_1_message.nested_factory_1_enum = 0
68 msg.factory_1_message.nested_factory_1_message.value = (
69 'nested message value')
70 msg.factory_1_message.scalar_value = 22
71 msg.factory_1_message.list_value.extend([
u'one',
u'two',
u'three'])
72 msg.factory_1_message.list_value.append(
u'four')
73 msg.factory_1_enum = 1
74 msg.nested_factory_1_enum = 0
75 msg.nested_factory_1_message.value =
'nested message value'
76 msg.circular_message.mandatory = 1
77 msg.circular_message.circular_message.mandatory = 2
78 msg.circular_message.scalar_value =
'one deep'
79 msg.scalar_value =
'zero deep'
80 msg.list_value.extend([
u'four',
u'three',
u'two'])
81 msg.list_value.append(
u'one')
83 msg.grouped[0].part_1 =
'hello'
84 msg.grouped[0].part_2 =
'world'
85 msg.grouped.add(part_1=
'testing', part_2=
'123')
86 msg.loop.loop.mandatory = 2
87 msg.loop.loop.loop.loop.mandatory = 4
88 serialized = msg.SerializeToString()
89 converted = factory_test2_pb2.Factory2Message.FromString(serialized)
90 reserialized = converted.SerializeToString()
91 self.assertEqual(serialized, reserialized)
92 result = cls.FromString(reserialized)
93 self.assertEqual(msg, result)
101 cls = factory.GetPrototype(pool.FindMessageTypeByName(
102 'google.protobuf.python.internal.Factory2Message'))
103 self.assertFalse(cls
is factory_test2_pb2.Factory2Message)
105 cls2 = factory.GetPrototype(pool.FindMessageTypeByName(
106 'google.protobuf.python.internal.Factory2Message'))
107 self.assertTrue(cls
is cls2)
124 set([
'google.protobuf.python.internal.Factory2Message',
125 'google.protobuf.python.internal.Factory1Message'],
126 ).issubset(
set(messages.keys())))
128 messages[
'google.protobuf.python.internal.Factory2Message'])
129 factory_msg1 = messages[
'google.protobuf.python.internal.Factory1Message']
131 [
'google.protobuf.python.internal.Factory2Message.one_more_field',
132 'google.protobuf.python.internal.another_field'],).issubset(
set(
134 for ext
in factory_msg1.DESCRIPTOR.file.pool.FindAllExtensions(
135 factory_msg1.DESCRIPTOR))))
136 msg1 = messages[
'google.protobuf.python.internal.Factory1Message']()
137 ext1 = msg1.Extensions._FindExtensionByName(
138 'google.protobuf.python.internal.Factory2Message.one_more_field')
139 ext2 = msg1.Extensions._FindExtensionByName(
140 'google.protobuf.python.internal.another_field')
141 self.assertEqual(0,
len(msg1.Extensions))
142 msg1.Extensions[ext1] =
'test1'
143 msg1.Extensions[ext2] =
'test2'
144 self.assertEqual(
'test1', msg1.Extensions[ext1])
145 self.assertEqual(
'test2', msg1.Extensions[ext2])
146 self.assertEqual(
None,
147 msg1.Extensions._FindExtensionByNumber(12321))
148 self.assertEqual(2,
len(msg1.Extensions))
149 if api_implementation.Type() ==
'cpp':
150 self.assertRaises(TypeError,
151 msg1.Extensions._FindExtensionByName, 0)
152 self.assertRaises(TypeError,
153 msg1.Extensions._FindExtensionByNumber,
'')
155 self.assertEqual(
None,
156 msg1.Extensions._FindExtensionByName(0))
157 self.assertEqual(
None,
158 msg1.Extensions._FindExtensionByNumber(
''))
165 f = descriptor_pb2.FileDescriptorProto()
166 f.name =
'google/protobuf/internal/container.proto'
167 f.package =
'google.protobuf.python.internal'
168 msg = f.message_type.add()
169 msg.name =
'Container'
170 rng = msg.extension_range.add()
174 msgs = factory.GetMessages([f.name])
175 self.assertIn(
'google.protobuf.python.internal.Container', msgs)
178 f = descriptor_pb2.FileDescriptorProto()
179 f.name =
'google/protobuf/internal/extension.proto'
180 f.package =
'google.protobuf.python.internal'
181 f.dependency.append(
'google/protobuf/internal/container.proto')
182 msg = f.message_type.add()
183 msg.name =
'Extension'
184 ext = msg.extension.add()
185 ext.name =
'extension_field'
187 ext.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL
188 ext.type_name =
'Extension'
189 ext.extendee =
'Container'
191 msgs = factory.GetMessages([f.name])
192 self.assertIn(
'google.protobuf.python.internal.Extension', msgs)
195 f = descriptor_pb2.FileDescriptorProto()
196 f.name =
'google/protobuf/internal/duplicate.proto'
197 f.package =
'google.protobuf.python.internal'
198 f.dependency.append(
'google/protobuf/internal/container.proto')
199 msg = f.message_type.add()
200 msg.name =
'Duplicate'
201 ext = msg.extension.add()
202 ext.name =
'extension_field'
204 ext.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL
205 ext.type_name =
'Duplicate'
206 ext.extendee =
'Container'
209 with self.assertRaises(Exception)
as cm:
210 factory.GetMessages([f.name])
212 self.assertIn(
str(cm.exception),
214 '"google.protobuf.python.internal.Duplicate.extension_field" and'
215 ' "google.protobuf.python.internal.Extension.extension_field"'
216 ' both try to extend message type'
217 ' "google.protobuf.python.internal.Container"'
218 ' with field number 2.',
219 'Double registration of Extensions'])
222 if __name__ ==
'__main__':