31 """Tests for google.protobuf.message_factory."""
33 __author__ =
'matthewtoia@google.com (Matt Toia)'
47 @testing_refleaks.TestCase
48 class MessageFactoryTest(unittest.TestCase):
52 factory_test1_pb2.DESCRIPTOR.serialized_pb)
54 factory_test2_pb2.DESCRIPTOR.serialized_pb)
59 msg.nested_factory_2_enum = 0
60 msg.nested_factory_2_message.value =
'nested message value'
61 msg.factory_1_message.factory_1_enum = 1
62 msg.factory_1_message.nested_factory_1_enum = 0
63 msg.factory_1_message.nested_factory_1_message.value = (
64 'nested message value')
65 msg.factory_1_message.scalar_value = 22
66 msg.factory_1_message.list_value.extend([
u'one',
u'two',
u'three'])
67 msg.factory_1_message.list_value.append(
u'four')
68 msg.factory_1_enum = 1
69 msg.nested_factory_1_enum = 0
70 msg.nested_factory_1_message.value =
'nested message value'
71 msg.circular_message.mandatory = 1
72 msg.circular_message.circular_message.mandatory = 2
73 msg.circular_message.scalar_value =
'one deep'
74 msg.scalar_value =
'zero deep'
75 msg.list_value.extend([
u'four',
u'three',
u'two'])
76 msg.list_value.append(
u'one')
78 msg.grouped[0].part_1 =
'hello'
79 msg.grouped[0].part_2 =
'world'
80 msg.grouped.add(part_1=
'testing', part_2=
'123')
81 msg.loop.loop.mandatory = 2
82 msg.loop.loop.loop.loop.mandatory = 4
83 serialized = msg.SerializeToString()
84 converted = factory_test2_pb2.Factory2Message.FromString(serialized)
85 reserialized = converted.SerializeToString()
86 self.assertEqual(serialized, reserialized)
87 result = cls.FromString(reserialized)
88 self.assertEqual(msg, result)
96 cls = factory.GetPrototype(pool.FindMessageTypeByName(
97 'google.protobuf.python.internal.Factory2Message'))
98 self.assertFalse(cls
is factory_test2_pb2.Factory2Message)
100 cls2 = factory.GetPrototype(pool.FindMessageTypeByName(
101 'google.protobuf.python.internal.Factory2Message'))
102 self.assertTrue(cls
is cls2)
107 def CreatePrototype(self, descriptor):
108 cls = super(MyMessageFactory, self).CreatePrototype(descriptor)
116 factory = MyMessageFactory()
117 cls = factory.GetPrototype(pool.FindMessageTypeByName(
118 'google.protobuf.python.internal.Factory2Message'))
119 self.assertTrue(hasattr(cls,
'additional_field'))
136 set([
'google.protobuf.python.internal.Factory2Message',
137 'google.protobuf.python.internal.Factory1Message'],
138 ).issubset(
set(messages.keys())))
140 messages[
'google.protobuf.python.internal.Factory2Message'])
141 factory_msg1 = messages[
'google.protobuf.python.internal.Factory1Message']
143 [
'google.protobuf.python.internal.Factory2Message.one_more_field',
144 'google.protobuf.python.internal.another_field'],).issubset(
set(
146 for ext
in factory_msg1.DESCRIPTOR.file.pool.FindAllExtensions(
147 factory_msg1.DESCRIPTOR))))
148 msg1 = messages[
'google.protobuf.python.internal.Factory1Message']()
149 ext1 = msg1.Extensions._FindExtensionByName(
150 'google.protobuf.python.internal.Factory2Message.one_more_field')
151 ext2 = msg1.Extensions._FindExtensionByName(
152 'google.protobuf.python.internal.another_field')
153 self.assertEqual(0,
len(msg1.Extensions))
154 msg1.Extensions[ext1] =
'test1'
155 msg1.Extensions[ext2] =
'test2'
156 self.assertEqual(
'test1', msg1.Extensions[ext1])
157 self.assertEqual(
'test2', msg1.Extensions[ext2])
158 self.assertEqual(
None,
159 msg1.Extensions._FindExtensionByNumber(12321))
160 self.assertEqual(2,
len(msg1.Extensions))
161 if api_implementation.Type() ==
'cpp':
162 self.assertRaises(TypeError,
163 msg1.Extensions._FindExtensionByName, 0)
164 self.assertRaises(TypeError,
165 msg1.Extensions._FindExtensionByNumber,
'')
167 self.assertEqual(
None,
168 msg1.Extensions._FindExtensionByName(0))
169 self.assertEqual(
None,
170 msg1.Extensions._FindExtensionByNumber(
''))
177 f = descriptor_pb2.FileDescriptorProto()
178 f.name =
'google/protobuf/internal/container.proto'
179 f.package =
'google.protobuf.python.internal'
180 msg = f.message_type.add()
181 msg.name =
'Container'
182 rng = msg.extension_range.add()
186 msgs = factory.GetMessages([f.name])
187 self.assertIn(
'google.protobuf.python.internal.Container', msgs)
190 f = descriptor_pb2.FileDescriptorProto()
191 f.name =
'google/protobuf/internal/extension.proto'
192 f.package =
'google.protobuf.python.internal'
193 f.dependency.append(
'google/protobuf/internal/container.proto')
194 msg = f.message_type.add()
195 msg.name =
'Extension'
196 ext = msg.extension.add()
197 ext.name =
'extension_field'
199 ext.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL
200 ext.type_name =
'Extension'
201 ext.extendee =
'Container'
203 msgs = factory.GetMessages([f.name])
204 self.assertIn(
'google.protobuf.python.internal.Extension', msgs)
207 f = descriptor_pb2.FileDescriptorProto()
208 f.name =
'google/protobuf/internal/duplicate.proto'
209 f.package =
'google.protobuf.python.internal'
210 f.dependency.append(
'google/protobuf/internal/container.proto')
211 msg = f.message_type.add()
212 msg.name =
'Duplicate'
213 ext = msg.extension.add()
214 ext.name =
'extension_field'
216 ext.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL
217 ext.type_name =
'Duplicate'
218 ext.extendee =
'Container'
221 with self.assertRaises(Exception)
as cm:
222 factory.GetMessages([f.name])
224 self.assertIn(
str(cm.exception),
226 '"google.protobuf.python.internal.Duplicate.extension_field" and'
227 ' "google.protobuf.python.internal.Extension.extension_field"'
228 ' both try to extend message type'
229 ' "google.protobuf.python.internal.Container"'
230 ' with field number 2.',
231 'Double registration of Extensions'])
234 if __name__ ==
'__main__':