google/protobuf/internal/message_test.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #
4 # Protocol Buffers - Google's data interchange format
5 # Copyright 2008 Google Inc. All rights reserved.
6 # https://developers.google.com/protocol-buffers/
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions are
10 # met:
11 #
12 # * Redistributions of source code must retain the above copyright
13 # notice, this list of conditions and the following disclaimer.
14 # * Redistributions in binary form must reproduce the above
15 # copyright notice, this list of conditions and the following disclaimer
16 # in the documentation and/or other materials provided with the
17 # distribution.
18 # * Neither the name of Google Inc. nor the names of its
19 # contributors may be used to endorse or promote products derived from
20 # this software without specific prior written permission.
21 #
22 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 
34 """Tests python protocol buffers against the golden message.
35 
36 Note that the golden messages exercise every known field type, thus this
37 test ends up exercising and verifying nearly all of the parsing and
38 serialization code in the whole library.
39 
40 TODO(kenton): Merge with wire_format_test? It doesn't make a whole lot of
41 sense to call this a test of the "message" module, which only declares an
42 abstract interface.
43 """
44 
45 __author__ = 'gps@google.com (Gregory P. Smith)'
46 
47 
48 import copy
49 import math
50 import operator
51 import pickle
52 import pydoc
53 import six
54 import sys
55 import warnings
56 
57 try:
58  # Since python 3
59  import collections.abc as collections_abc
60 except ImportError:
61  # Won't work after python 3.8
62  import collections as collections_abc
63 
64 try:
65  import unittest2 as unittest # PY26
66 except ImportError:
67  import unittest
68 try:
69  cmp # Python 2
70 except NameError:
71  cmp = lambda x, y: (x > y) - (x < y) # Python 3
72 
73 from google.protobuf import map_proto2_unittest_pb2
74 from google.protobuf import map_unittest_pb2
75 from google.protobuf import unittest_pb2
76 from google.protobuf import unittest_proto3_arena_pb2
77 from google.protobuf import descriptor_pb2
78 from google.protobuf import descriptor_pool
79 from google.protobuf import message_factory
80 from google.protobuf import text_format
81 from google.protobuf.internal import api_implementation
82 from google.protobuf.internal import encoder
83 from google.protobuf.internal import more_extensions_pb2
84 from google.protobuf.internal import packed_field_test_pb2
85 from google.protobuf.internal import test_util
86 from google.protobuf.internal import testing_refleaks
87 from google.protobuf import message
88 from google.protobuf.internal import _parameterized
89 
90 UCS2_MAXUNICODE = 65535
91 if six.PY3:
92  long = int
93 
94 
95 # Python pre-2.6 does not have isinf() or isnan() functions, so we have
96 # to provide our own.
97 def isnan(val):
98  # NaN is never equal to itself.
99  return val != val
100 def isinf(val):
101  # Infinity times zero equals NaN.
102  return not isnan(val) and isnan(val * 0)
103 def IsPosInf(val):
104  return isinf(val) and (val > 0)
105 def IsNegInf(val):
106  return isinf(val) and (val < 0)
107 
108 
109 @_parameterized.named_parameters(
110  ('_proto2', unittest_pb2),
111  ('_proto3', unittest_proto3_arena_pb2))
112 @testing_refleaks.TestCase
113 class MessageTest(unittest.TestCase):
114 
115  def testBadUtf8String(self, message_module):
116  if api_implementation.Type() != 'python':
117  self.skipTest("Skipping testBadUtf8String, currently only the python "
118  "api implementation raises UnicodeDecodeError when a "
119  "string field contains bad utf-8.")
120  bad_utf8_data = test_util.GoldenFileData('bad_utf8_string')
121  with self.assertRaises(UnicodeDecodeError) as context:
122  message_module.TestAllTypes.FromString(bad_utf8_data)
123  self.assertIn('TestAllTypes.optional_string', str(context.exception))
124 
125  def testGoldenMessage(self, message_module):
126  # Proto3 doesn't have the "default_foo" members or foreign enums,
127  # and doesn't preserve unknown fields, so for proto3 we use a golden
128  # message that doesn't have these fields set.
129  if message_module is unittest_pb2:
130  golden_data = test_util.GoldenFileData(
131  'golden_message_oneof_implemented')
132  else:
133  golden_data = test_util.GoldenFileData('golden_message_proto3')
134 
135  golden_message = message_module.TestAllTypes()
136  golden_message.ParseFromString(golden_data)
137  if message_module is unittest_pb2:
138  test_util.ExpectAllFieldsSet(self, golden_message)
139  self.assertEqual(golden_data, golden_message.SerializeToString())
140  golden_copy = copy.deepcopy(golden_message)
141  self.assertEqual(golden_data, golden_copy.SerializeToString())
142 
143  def testGoldenPackedMessage(self, message_module):
144  golden_data = test_util.GoldenFileData('golden_packed_fields_message')
145  golden_message = message_module.TestPackedTypes()
146  parsed_bytes = golden_message.ParseFromString(golden_data)
147  all_set = message_module.TestPackedTypes()
148  test_util.SetAllPackedFields(all_set)
149  self.assertEqual(parsed_bytes, len(golden_data))
150  self.assertEqual(all_set, golden_message)
151  self.assertEqual(golden_data, all_set.SerializeToString())
152  golden_copy = copy.deepcopy(golden_message)
153  self.assertEqual(golden_data, golden_copy.SerializeToString())
154 
155  def testParseErrors(self, message_module):
156  msg = message_module.TestAllTypes()
157  self.assertRaises(TypeError, msg.FromString, 0)
158  self.assertRaises(Exception, msg.FromString, '0')
159  # TODO(jieluo): Fix cpp extension to raise error instead of warning.
160  # b/27494216
161  end_tag = encoder.TagBytes(1, 4)
162  if api_implementation.Type() == 'python':
163  with self.assertRaises(message.DecodeError) as context:
164  msg.FromString(end_tag)
165  self.assertEqual('Unexpected end-group tag.', str(context.exception))
166 
167  def testDeterminismParameters(self, message_module):
168  # This message is always deterministically serialized, even if determinism
169  # is disabled, so we can use it to verify that all the determinism
170  # parameters work correctly.
171  golden_data = (b'\xe2\x02\nOne string'
172  b'\xe2\x02\nTwo string'
173  b'\xe2\x02\nRed string'
174  b'\xe2\x02\x0bBlue string')
175  golden_message = message_module.TestAllTypes()
176  golden_message.repeated_string.extend([
177  'One string',
178  'Two string',
179  'Red string',
180  'Blue string',
181  ])
182  self.assertEqual(golden_data,
183  golden_message.SerializeToString(deterministic=None))
184  self.assertEqual(golden_data,
185  golden_message.SerializeToString(deterministic=False))
186  self.assertEqual(golden_data,
187  golden_message.SerializeToString(deterministic=True))
188 
189  class BadArgError(Exception):
190  pass
191 
192  class BadArg(object):
193 
194  def __nonzero__(self):
195  raise BadArgError()
196 
197  def __bool__(self):
198  raise BadArgError()
199 
200  with self.assertRaises(BadArgError):
201  golden_message.SerializeToString(deterministic=BadArg())
202 
203  def testPickleSupport(self, message_module):
204  golden_data = test_util.GoldenFileData('golden_message')
205  golden_message = message_module.TestAllTypes()
206  golden_message.ParseFromString(golden_data)
207  pickled_message = pickle.dumps(golden_message)
208 
209  unpickled_message = pickle.loads(pickled_message)
210  self.assertEqual(unpickled_message, golden_message)
211 
212  def testPositiveInfinity(self, message_module):
213  if message_module is unittest_pb2:
214  golden_data = (b'\x5D\x00\x00\x80\x7F'
215  b'\x61\x00\x00\x00\x00\x00\x00\xF0\x7F'
216  b'\xCD\x02\x00\x00\x80\x7F'
217  b'\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\x7F')
218  else:
219  golden_data = (b'\x5D\x00\x00\x80\x7F'
220  b'\x61\x00\x00\x00\x00\x00\x00\xF0\x7F'
221  b'\xCA\x02\x04\x00\x00\x80\x7F'
222  b'\xD2\x02\x08\x00\x00\x00\x00\x00\x00\xF0\x7F')
223 
224  golden_message = message_module.TestAllTypes()
225  golden_message.ParseFromString(golden_data)
226  self.assertTrue(IsPosInf(golden_message.optional_float))
227  self.assertTrue(IsPosInf(golden_message.optional_double))
228  self.assertTrue(IsPosInf(golden_message.repeated_float[0]))
229  self.assertTrue(IsPosInf(golden_message.repeated_double[0]))
230  self.assertEqual(golden_data, golden_message.SerializeToString())
231 
232  def testNegativeInfinity(self, message_module):
233  if message_module is unittest_pb2:
234  golden_data = (b'\x5D\x00\x00\x80\xFF'
235  b'\x61\x00\x00\x00\x00\x00\x00\xF0\xFF'
236  b'\xCD\x02\x00\x00\x80\xFF'
237  b'\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\xFF')
238  else:
239  golden_data = (b'\x5D\x00\x00\x80\xFF'
240  b'\x61\x00\x00\x00\x00\x00\x00\xF0\xFF'
241  b'\xCA\x02\x04\x00\x00\x80\xFF'
242  b'\xD2\x02\x08\x00\x00\x00\x00\x00\x00\xF0\xFF')
243 
244  golden_message = message_module.TestAllTypes()
245  golden_message.ParseFromString(golden_data)
246  self.assertTrue(IsNegInf(golden_message.optional_float))
247  self.assertTrue(IsNegInf(golden_message.optional_double))
248  self.assertTrue(IsNegInf(golden_message.repeated_float[0]))
249  self.assertTrue(IsNegInf(golden_message.repeated_double[0]))
250  self.assertEqual(golden_data, golden_message.SerializeToString())
251 
252  def testNotANumber(self, message_module):
253  golden_data = (b'\x5D\x00\x00\xC0\x7F'
254  b'\x61\x00\x00\x00\x00\x00\x00\xF8\x7F'
255  b'\xCD\x02\x00\x00\xC0\x7F'
256  b'\xD1\x02\x00\x00\x00\x00\x00\x00\xF8\x7F')
257  golden_message = message_module.TestAllTypes()
258  golden_message.ParseFromString(golden_data)
259  self.assertTrue(isnan(golden_message.optional_float))
260  self.assertTrue(isnan(golden_message.optional_double))
261  self.assertTrue(isnan(golden_message.repeated_float[0]))
262  self.assertTrue(isnan(golden_message.repeated_double[0]))
263 
264  # The protocol buffer may serialize to any one of multiple different
265  # representations of a NaN. Rather than verify a specific representation,
266  # verify the serialized string can be converted into a correctly
267  # behaving protocol buffer.
268  serialized = golden_message.SerializeToString()
269  message = message_module.TestAllTypes()
270  message.ParseFromString(serialized)
271  self.assertTrue(isnan(message.optional_float))
272  self.assertTrue(isnan(message.optional_double))
273  self.assertTrue(isnan(message.repeated_float[0]))
274  self.assertTrue(isnan(message.repeated_double[0]))
275 
276  def testPositiveInfinityPacked(self, message_module):
277  golden_data = (b'\xA2\x06\x04\x00\x00\x80\x7F'
278  b'\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\x7F')
279  golden_message = message_module.TestPackedTypes()
280  golden_message.ParseFromString(golden_data)
281  self.assertTrue(IsPosInf(golden_message.packed_float[0]))
282  self.assertTrue(IsPosInf(golden_message.packed_double[0]))
283  self.assertEqual(golden_data, golden_message.SerializeToString())
284 
285  def testNegativeInfinityPacked(self, message_module):
286  golden_data = (b'\xA2\x06\x04\x00\x00\x80\xFF'
287  b'\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\xFF')
288  golden_message = message_module.TestPackedTypes()
289  golden_message.ParseFromString(golden_data)
290  self.assertTrue(IsNegInf(golden_message.packed_float[0]))
291  self.assertTrue(IsNegInf(golden_message.packed_double[0]))
292  self.assertEqual(golden_data, golden_message.SerializeToString())
293 
294  def testNotANumberPacked(self, message_module):
295  golden_data = (b'\xA2\x06\x04\x00\x00\xC0\x7F'
296  b'\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF8\x7F')
297  golden_message = message_module.TestPackedTypes()
298  golden_message.ParseFromString(golden_data)
299  self.assertTrue(isnan(golden_message.packed_float[0]))
300  self.assertTrue(isnan(golden_message.packed_double[0]))
301 
302  serialized = golden_message.SerializeToString()
303  message = message_module.TestPackedTypes()
304  message.ParseFromString(serialized)
305  self.assertTrue(isnan(message.packed_float[0]))
306  self.assertTrue(isnan(message.packed_double[0]))
307 
308  def testExtremeFloatValues(self, message_module):
309  message = message_module.TestAllTypes()
310 
311  # Most positive exponent, no significand bits set.
312  kMostPosExponentNoSigBits = math.pow(2, 127)
313  message.optional_float = kMostPosExponentNoSigBits
314  message.ParseFromString(message.SerializeToString())
315  self.assertTrue(message.optional_float == kMostPosExponentNoSigBits)
316 
317  # Most positive exponent, one significand bit set.
318  kMostPosExponentOneSigBit = 1.5 * math.pow(2, 127)
319  message.optional_float = kMostPosExponentOneSigBit
320  message.ParseFromString(message.SerializeToString())
321  self.assertTrue(message.optional_float == kMostPosExponentOneSigBit)
322 
323  # Repeat last two cases with values of same magnitude, but negative.
324  message.optional_float = -kMostPosExponentNoSigBits
325  message.ParseFromString(message.SerializeToString())
326  self.assertTrue(message.optional_float == -kMostPosExponentNoSigBits)
327 
328  message.optional_float = -kMostPosExponentOneSigBit
329  message.ParseFromString(message.SerializeToString())
330  self.assertTrue(message.optional_float == -kMostPosExponentOneSigBit)
331 
332  # Most negative exponent, no significand bits set.
333  kMostNegExponentNoSigBits = math.pow(2, -127)
334  message.optional_float = kMostNegExponentNoSigBits
335  message.ParseFromString(message.SerializeToString())
336  self.assertTrue(message.optional_float == kMostNegExponentNoSigBits)
337 
338  # Most negative exponent, one significand bit set.
339  kMostNegExponentOneSigBit = 1.5 * math.pow(2, -127)
340  message.optional_float = kMostNegExponentOneSigBit
341  message.ParseFromString(message.SerializeToString())
342  self.assertTrue(message.optional_float == kMostNegExponentOneSigBit)
343 
344  # Repeat last two cases with values of the same magnitude, but negative.
345  message.optional_float = -kMostNegExponentNoSigBits
346  message.ParseFromString(message.SerializeToString())
347  self.assertTrue(message.optional_float == -kMostNegExponentNoSigBits)
348 
349  message.optional_float = -kMostNegExponentOneSigBit
350  message.ParseFromString(message.SerializeToString())
351  self.assertTrue(message.optional_float == -kMostNegExponentOneSigBit)
352 
353  # Max 4 bytes float value
354  max_float = float.fromhex('0x1.fffffep+127')
355  message.optional_float = max_float
356  self.assertAlmostEqual(message.optional_float, max_float)
357  serialized_data = message.SerializeToString()
358  message.ParseFromString(serialized_data)
359  self.assertAlmostEqual(message.optional_float, max_float)
360 
361  # Test set double to float field.
362  message.optional_float = 3.4028235e+39
363  self.assertEqual(message.optional_float, float('inf'))
364  serialized_data = message.SerializeToString()
365  message.ParseFromString(serialized_data)
366  self.assertEqual(message.optional_float, float('inf'))
367 
368  message.optional_float = -3.4028235e+39
369  self.assertEqual(message.optional_float, float('-inf'))
370 
371  message.optional_float = 1.4028235e-39
372  self.assertAlmostEqual(message.optional_float, 1.4028235e-39)
373 
374  def testExtremeDoubleValues(self, message_module):
375  message = message_module.TestAllTypes()
376 
377  # Most positive exponent, no significand bits set.
378  kMostPosExponentNoSigBits = math.pow(2, 1023)
379  message.optional_double = kMostPosExponentNoSigBits
380  message.ParseFromString(message.SerializeToString())
381  self.assertTrue(message.optional_double == kMostPosExponentNoSigBits)
382 
383  # Most positive exponent, one significand bit set.
384  kMostPosExponentOneSigBit = 1.5 * math.pow(2, 1023)
385  message.optional_double = kMostPosExponentOneSigBit
386  message.ParseFromString(message.SerializeToString())
387  self.assertTrue(message.optional_double == kMostPosExponentOneSigBit)
388 
389  # Repeat last two cases with values of same magnitude, but negative.
390  message.optional_double = -kMostPosExponentNoSigBits
391  message.ParseFromString(message.SerializeToString())
392  self.assertTrue(message.optional_double == -kMostPosExponentNoSigBits)
393 
394  message.optional_double = -kMostPosExponentOneSigBit
395  message.ParseFromString(message.SerializeToString())
396  self.assertTrue(message.optional_double == -kMostPosExponentOneSigBit)
397 
398  # Most negative exponent, no significand bits set.
399  kMostNegExponentNoSigBits = math.pow(2, -1023)
400  message.optional_double = kMostNegExponentNoSigBits
401  message.ParseFromString(message.SerializeToString())
402  self.assertTrue(message.optional_double == kMostNegExponentNoSigBits)
403 
404  # Most negative exponent, one significand bit set.
405  kMostNegExponentOneSigBit = 1.5 * math.pow(2, -1023)
406  message.optional_double = kMostNegExponentOneSigBit
407  message.ParseFromString(message.SerializeToString())
408  self.assertTrue(message.optional_double == kMostNegExponentOneSigBit)
409 
410  # Repeat last two cases with values of the same magnitude, but negative.
411  message.optional_double = -kMostNegExponentNoSigBits
412  message.ParseFromString(message.SerializeToString())
413  self.assertTrue(message.optional_double == -kMostNegExponentNoSigBits)
414 
415  message.optional_double = -kMostNegExponentOneSigBit
416  message.ParseFromString(message.SerializeToString())
417  self.assertTrue(message.optional_double == -kMostNegExponentOneSigBit)
418 
419  def testFloatPrinting(self, message_module):
420  message = message_module.TestAllTypes()
421  message.optional_float = 2.0
422  self.assertEqual(str(message), 'optional_float: 2.0\n')
423 
424  def testHighPrecisionFloatPrinting(self, message_module):
425  message = message_module.TestAllTypes()
426  message.optional_double = 0.12345678912345678
427  if sys.version_info >= (3,):
428  self.assertEqual(str(message), 'optional_double: 0.12345678912345678\n')
429  else:
430  self.assertEqual(str(message), 'optional_double: 0.123456789123\n')
431 
432  def testUnknownFieldPrinting(self, message_module):
433  populated = message_module.TestAllTypes()
434  test_util.SetAllNonLazyFields(populated)
435  empty = message_module.TestEmptyMessage()
436  empty.ParseFromString(populated.SerializeToString())
437  self.assertEqual(str(empty), '')
438 
439  def testAppendRepeatedCompositeField(self, message_module):
440  msg = message_module.TestAllTypes()
441  msg.repeated_nested_message.append(
442  message_module.TestAllTypes.NestedMessage(bb=1))
443  nested = message_module.TestAllTypes.NestedMessage(bb=2)
444  msg.repeated_nested_message.append(nested)
445  try:
446  msg.repeated_nested_message.append(1)
447  except TypeError:
448  pass
449  self.assertEqual(2, len(msg.repeated_nested_message))
450  self.assertEqual([1, 2],
451  [m.bb for m in msg.repeated_nested_message])
452 
453  def testInsertRepeatedCompositeField(self, message_module):
454  msg = message_module.TestAllTypes()
455  msg.repeated_nested_message.insert(
456  -1, message_module.TestAllTypes.NestedMessage(bb=1))
457  sub_msg = msg.repeated_nested_message[0]
458  msg.repeated_nested_message.insert(
459  0, message_module.TestAllTypes.NestedMessage(bb=2))
460  msg.repeated_nested_message.insert(
461  99, message_module.TestAllTypes.NestedMessage(bb=3))
462  msg.repeated_nested_message.insert(
463  -2, message_module.TestAllTypes.NestedMessage(bb=-1))
464  msg.repeated_nested_message.insert(
465  -1000, message_module.TestAllTypes.NestedMessage(bb=-1000))
466  try:
467  msg.repeated_nested_message.insert(1, 999)
468  except TypeError:
469  pass
470  self.assertEqual(5, len(msg.repeated_nested_message))
471  self.assertEqual([-1000, 2, -1, 1, 3],
472  [m.bb for m in msg.repeated_nested_message])
473  self.assertEqual(str(msg),
474  'repeated_nested_message {\n'
475  ' bb: -1000\n'
476  '}\n'
477  'repeated_nested_message {\n'
478  ' bb: 2\n'
479  '}\n'
480  'repeated_nested_message {\n'
481  ' bb: -1\n'
482  '}\n'
483  'repeated_nested_message {\n'
484  ' bb: 1\n'
485  '}\n'
486  'repeated_nested_message {\n'
487  ' bb: 3\n'
488  '}\n')
489  self.assertEqual(sub_msg.bb, 1)
490 
491  def testMergeFromRepeatedField(self, message_module):
492  msg = message_module.TestAllTypes()
493  msg.repeated_int32.append(1)
494  msg.repeated_int32.append(3)
495  msg.repeated_nested_message.add(bb=1)
496  msg.repeated_nested_message.add(bb=2)
497  other_msg = message_module.TestAllTypes()
498  other_msg.repeated_nested_message.add(bb=3)
499  other_msg.repeated_nested_message.add(bb=4)
500  other_msg.repeated_int32.append(5)
501  other_msg.repeated_int32.append(7)
502 
503  msg.repeated_int32.MergeFrom(other_msg.repeated_int32)
504  self.assertEqual(4, len(msg.repeated_int32))
505 
506  msg.repeated_nested_message.MergeFrom(other_msg.repeated_nested_message)
507  self.assertEqual([1, 2, 3, 4],
508  [m.bb for m in msg.repeated_nested_message])
509 
510  def testAddWrongRepeatedNestedField(self, message_module):
511  msg = message_module.TestAllTypes()
512  try:
513  msg.repeated_nested_message.add('wrong')
514  except TypeError:
515  pass
516  try:
517  msg.repeated_nested_message.add(value_field='wrong')
518  except ValueError:
519  pass
520  self.assertEqual(len(msg.repeated_nested_message), 0)
521 
522  def testRepeatedContains(self, message_module):
523  msg = message_module.TestAllTypes()
524  msg.repeated_int32.extend([1, 2, 3])
525  self.assertIn(2, msg.repeated_int32)
526  self.assertNotIn(0, msg.repeated_int32)
527 
528  msg.repeated_nested_message.add(bb=1)
529  sub_msg1 = msg.repeated_nested_message[0]
530  sub_msg2 = message_module.TestAllTypes.NestedMessage(bb=2)
531  sub_msg3 = message_module.TestAllTypes.NestedMessage(bb=3)
532  msg.repeated_nested_message.append(sub_msg2)
533  msg.repeated_nested_message.insert(0, sub_msg3)
534  self.assertIn(sub_msg1, msg.repeated_nested_message)
535  self.assertIn(sub_msg2, msg.repeated_nested_message)
536  self.assertIn(sub_msg3, msg.repeated_nested_message)
537 
538  def testRepeatedScalarIterable(self, message_module):
539  msg = message_module.TestAllTypes()
540  msg.repeated_int32.extend([1, 2, 3])
541  add = 0
542  for item in msg.repeated_int32:
543  add += item
544  self.assertEqual(add, 6)
545 
546  def testRepeatedNestedFieldIteration(self, message_module):
547  msg = message_module.TestAllTypes()
548  msg.repeated_nested_message.add(bb=1)
549  msg.repeated_nested_message.add(bb=2)
550  msg.repeated_nested_message.add(bb=3)
551  msg.repeated_nested_message.add(bb=4)
552 
553  self.assertEqual([1, 2, 3, 4],
554  [m.bb for m in msg.repeated_nested_message])
555  self.assertEqual([4, 3, 2, 1],
556  [m.bb for m in reversed(msg.repeated_nested_message)])
557  self.assertEqual([4, 3, 2, 1],
558  [m.bb for m in msg.repeated_nested_message[::-1]])
559 
561  """Check some different types with the default comparator."""
562  message = message_module.TestAllTypes()
563 
564  # TODO(mattp): would testing more scalar types strengthen test?
565  message.repeated_int32.append(1)
566  message.repeated_int32.append(3)
567  message.repeated_int32.append(2)
568  message.repeated_int32.sort()
569  self.assertEqual(message.repeated_int32[0], 1)
570  self.assertEqual(message.repeated_int32[1], 2)
571  self.assertEqual(message.repeated_int32[2], 3)
572  self.assertEqual(str(message.repeated_int32), str([1, 2, 3]))
573 
574  message.repeated_float.append(1.1)
575  message.repeated_float.append(1.3)
576  message.repeated_float.append(1.2)
577  message.repeated_float.sort()
578  self.assertAlmostEqual(message.repeated_float[0], 1.1)
579  self.assertAlmostEqual(message.repeated_float[1], 1.2)
580  self.assertAlmostEqual(message.repeated_float[2], 1.3)
581 
582  message.repeated_string.append('a')
583  message.repeated_string.append('c')
584  message.repeated_string.append('b')
585  message.repeated_string.sort()
586  self.assertEqual(message.repeated_string[0], 'a')
587  self.assertEqual(message.repeated_string[1], 'b')
588  self.assertEqual(message.repeated_string[2], 'c')
589  self.assertEqual(str(message.repeated_string), str([u'a', u'b', u'c']))
590 
591  message.repeated_bytes.append(b'a')
592  message.repeated_bytes.append(b'c')
593  message.repeated_bytes.append(b'b')
594  message.repeated_bytes.sort()
595  self.assertEqual(message.repeated_bytes[0], b'a')
596  self.assertEqual(message.repeated_bytes[1], b'b')
597  self.assertEqual(message.repeated_bytes[2], b'c')
598  self.assertEqual(str(message.repeated_bytes), str([b'a', b'b', b'c']))
599 
601  """Check some different types with custom comparator."""
602  message = message_module.TestAllTypes()
603 
604  message.repeated_int32.append(-3)
605  message.repeated_int32.append(-2)
606  message.repeated_int32.append(-1)
607  message.repeated_int32.sort(key=abs)
608  self.assertEqual(message.repeated_int32[0], -1)
609  self.assertEqual(message.repeated_int32[1], -2)
610  self.assertEqual(message.repeated_int32[2], -3)
611 
612  message.repeated_string.append('aaa')
613  message.repeated_string.append('bb')
614  message.repeated_string.append('c')
615  message.repeated_string.sort(key=len)
616  self.assertEqual(message.repeated_string[0], 'c')
617  self.assertEqual(message.repeated_string[1], 'bb')
618  self.assertEqual(message.repeated_string[2], 'aaa')
619 
621  """Check passing a custom comparator to sort a repeated composite field."""
622  message = message_module.TestAllTypes()
623 
624  message.repeated_nested_message.add().bb = 1
625  message.repeated_nested_message.add().bb = 3
626  message.repeated_nested_message.add().bb = 2
627  message.repeated_nested_message.add().bb = 6
628  message.repeated_nested_message.add().bb = 5
629  message.repeated_nested_message.add().bb = 4
630  message.repeated_nested_message.sort(key=operator.attrgetter('bb'))
631  self.assertEqual(message.repeated_nested_message[0].bb, 1)
632  self.assertEqual(message.repeated_nested_message[1].bb, 2)
633  self.assertEqual(message.repeated_nested_message[2].bb, 3)
634  self.assertEqual(message.repeated_nested_message[3].bb, 4)
635  self.assertEqual(message.repeated_nested_message[4].bb, 5)
636  self.assertEqual(message.repeated_nested_message[5].bb, 6)
637  self.assertEqual(str(message.repeated_nested_message),
638  '[bb: 1\n, bb: 2\n, bb: 3\n, bb: 4\n, bb: 5\n, bb: 6\n]')
639 
640  def testSortingRepeatedCompositeFieldsStable(self, message_module):
641  """Check passing a custom comparator to sort a repeated composite field."""
642  message = message_module.TestAllTypes()
643 
644  message.repeated_nested_message.add().bb = 21
645  message.repeated_nested_message.add().bb = 20
646  message.repeated_nested_message.add().bb = 13
647  message.repeated_nested_message.add().bb = 33
648  message.repeated_nested_message.add().bb = 11
649  message.repeated_nested_message.add().bb = 24
650  message.repeated_nested_message.add().bb = 10
651  message.repeated_nested_message.sort(key=lambda z: z.bb // 10)
652  self.assertEqual(
653  [13, 11, 10, 21, 20, 24, 33],
654  [n.bb for n in message.repeated_nested_message])
655 
656  # Make sure that for the C++ implementation, the underlying fields
657  # are actually reordered.
658  pb = message.SerializeToString()
659  message.Clear()
660  message.MergeFromString(pb)
661  self.assertEqual(
662  [13, 11, 10, 21, 20, 24, 33],
663  [n.bb for n in message.repeated_nested_message])
664 
665  def testRepeatedCompositeFieldSortArguments(self, message_module):
666  """Check sorting a repeated composite field using list.sort() arguments."""
667  message = message_module.TestAllTypes()
668 
669  get_bb = operator.attrgetter('bb')
670  cmp_bb = lambda a, b: cmp(a.bb, b.bb)
671  message.repeated_nested_message.add().bb = 1
672  message.repeated_nested_message.add().bb = 3
673  message.repeated_nested_message.add().bb = 2
674  message.repeated_nested_message.add().bb = 6
675  message.repeated_nested_message.add().bb = 5
676  message.repeated_nested_message.add().bb = 4
677  message.repeated_nested_message.sort(key=get_bb)
678  self.assertEqual([k.bb for k in message.repeated_nested_message],
679  [1, 2, 3, 4, 5, 6])
680  message.repeated_nested_message.sort(key=get_bb, reverse=True)
681  self.assertEqual([k.bb for k in message.repeated_nested_message],
682  [6, 5, 4, 3, 2, 1])
683  if sys.version_info >= (3,): return # No cmp sorting in PY3.
684  message.repeated_nested_message.sort(sort_function=cmp_bb)
685  self.assertEqual([k.bb for k in message.repeated_nested_message],
686  [1, 2, 3, 4, 5, 6])
687  message.repeated_nested_message.sort(cmp=cmp_bb, reverse=True)
688  self.assertEqual([k.bb for k in message.repeated_nested_message],
689  [6, 5, 4, 3, 2, 1])
690 
691  def testRepeatedScalarFieldSortArguments(self, message_module):
692  """Check sorting a scalar field using list.sort() arguments."""
693  message = message_module.TestAllTypes()
694 
695  message.repeated_int32.append(-3)
696  message.repeated_int32.append(-2)
697  message.repeated_int32.append(-1)
698  message.repeated_int32.sort(key=abs)
699  self.assertEqual(list(message.repeated_int32), [-1, -2, -3])
700  message.repeated_int32.sort(key=abs, reverse=True)
701  self.assertEqual(list(message.repeated_int32), [-3, -2, -1])
702  if sys.version_info < (3,): # No cmp sorting in PY3.
703  abs_cmp = lambda a, b: cmp(abs(a), abs(b))
704  message.repeated_int32.sort(sort_function=abs_cmp)
705  self.assertEqual(list(message.repeated_int32), [-1, -2, -3])
706  message.repeated_int32.sort(cmp=abs_cmp, reverse=True)
707  self.assertEqual(list(message.repeated_int32), [-3, -2, -1])
708 
709  message.repeated_string.append('aaa')
710  message.repeated_string.append('bb')
711  message.repeated_string.append('c')
712  message.repeated_string.sort(key=len)
713  self.assertEqual(list(message.repeated_string), ['c', 'bb', 'aaa'])
714  message.repeated_string.sort(key=len, reverse=True)
715  self.assertEqual(list(message.repeated_string), ['aaa', 'bb', 'c'])
716  if sys.version_info < (3,): # No cmp sorting in PY3.
717  len_cmp = lambda a, b: cmp(len(a), len(b))
718  message.repeated_string.sort(sort_function=len_cmp)
719  self.assertEqual(list(message.repeated_string), ['c', 'bb', 'aaa'])
720  message.repeated_string.sort(cmp=len_cmp, reverse=True)
721  self.assertEqual(list(message.repeated_string), ['aaa', 'bb', 'c'])
722 
723  def testRepeatedFieldsComparable(self, message_module):
724  m1 = message_module.TestAllTypes()
725  m2 = message_module.TestAllTypes()
726  m1.repeated_int32.append(0)
727  m1.repeated_int32.append(1)
728  m1.repeated_int32.append(2)
729  m2.repeated_int32.append(0)
730  m2.repeated_int32.append(1)
731  m2.repeated_int32.append(2)
732  m1.repeated_nested_message.add().bb = 1
733  m1.repeated_nested_message.add().bb = 2
734  m1.repeated_nested_message.add().bb = 3
735  m2.repeated_nested_message.add().bb = 1
736  m2.repeated_nested_message.add().bb = 2
737  m2.repeated_nested_message.add().bb = 3
738 
739  if sys.version_info >= (3,): return # No cmp() in PY3.
740 
741  # These comparisons should not raise errors.
742  _ = m1 < m2
743  _ = m1.repeated_nested_message < m2.repeated_nested_message
744 
745  # Make sure cmp always works. If it wasn't defined, these would be
746  # id() comparisons and would all fail.
747  self.assertEqual(cmp(m1, m2), 0)
748  self.assertEqual(cmp(m1.repeated_int32, m2.repeated_int32), 0)
749  self.assertEqual(cmp(m1.repeated_int32, [0, 1, 2]), 0)
750  self.assertEqual(cmp(m1.repeated_nested_message,
751  m2.repeated_nested_message), 0)
752  with self.assertRaises(TypeError):
753  # Can't compare repeated composite containers to lists.
754  cmp(m1.repeated_nested_message, m2.repeated_nested_message[:])
755 
756  # TODO(anuraag): Implement extensiondict comparison in C++ and then add test
757 
758  def testRepeatedFieldsAreSequences(self, message_module):
759  m = message_module.TestAllTypes()
760  self.assertIsInstance(m.repeated_int32, collections_abc.MutableSequence)
761  self.assertIsInstance(m.repeated_nested_message,
762  collections_abc.MutableSequence)
763 
764  def testRepeatedFieldsNotHashable(self, message_module):
765  m = message_module.TestAllTypes()
766  with self.assertRaises(TypeError):
767  hash(m.repeated_int32)
768  with self.assertRaises(TypeError):
769  hash(m.repeated_nested_message)
770 
771  def testRepeatedFieldInsideNestedMessage(self, message_module):
772  m = message_module.NestedTestAllTypes()
773  m.payload.repeated_int32.extend([])
774  self.assertTrue(m.HasField('payload'))
775 
776  def testMergeFrom(self, message_module):
777  m1 = message_module.TestAllTypes()
778  m2 = message_module.TestAllTypes()
779  # Cpp extension will lazily create a sub message which is immutable.
780  nested = m1.optional_nested_message
781  self.assertEqual(0, nested.bb)
782  m2.optional_nested_message.bb = 1
783  # Make sure cmessage pointing to a mutable message after merge instead of
784  # the lazily created message.
785  m1.MergeFrom(m2)
786  self.assertEqual(1, nested.bb)
787 
788  # Test more nested sub message.
789  msg1 = message_module.NestedTestAllTypes()
790  msg2 = message_module.NestedTestAllTypes()
791  nested = msg1.child.payload.optional_nested_message
792  self.assertEqual(0, nested.bb)
793  msg2.child.payload.optional_nested_message.bb = 1
794  msg1.MergeFrom(msg2)
795  self.assertEqual(1, nested.bb)
796 
797  # Test repeated field.
798  self.assertEqual(msg1.payload.repeated_nested_message,
799  msg1.payload.repeated_nested_message)
800  nested = msg2.payload.repeated_nested_message.add()
801  nested.bb = 1
802  msg1.MergeFrom(msg2)
803  self.assertEqual(1, len(msg1.payload.repeated_nested_message))
804  self.assertEqual(1, nested.bb)
805 
806  def testMergeFromString(self, message_module):
807  m1 = message_module.TestAllTypes()
808  m2 = message_module.TestAllTypes()
809  # Cpp extension will lazily create a sub message which is immutable.
810  self.assertEqual(0, m1.optional_nested_message.bb)
811  m2.optional_nested_message.bb = 1
812  # Make sure cmessage pointing to a mutable message after merge instead of
813  # the lazily created message.
814  m1.MergeFromString(m2.SerializeToString())
815  self.assertEqual(1, m1.optional_nested_message.bb)
816 
817  @unittest.skipIf(six.PY2, 'memoryview objects are not supported on py2')
819  m2 = message_module.TestAllTypes()
820  m2.optional_string = 'scalar string'
821  m2.repeated_string.append('repeated string')
822  m2.optional_bytes = b'scalar bytes'
823  m2.repeated_bytes.append(b'repeated bytes')
824 
825  serialized = m2.SerializeToString()
826  memview = memoryview(serialized)
827  m1 = message_module.TestAllTypes.FromString(memview)
828 
829  self.assertEqual(m1.optional_bytes, b'scalar bytes')
830  self.assertEqual(m1.repeated_bytes, [b'repeated bytes'])
831  self.assertEqual(m1.optional_string, 'scalar string')
832  self.assertEqual(m1.repeated_string, ['repeated string'])
833  # Make sure that the memoryview was correctly converted to bytes, and
834  # that a sub-sliced memoryview is not being used.
835  self.assertIsInstance(m1.optional_bytes, bytes)
836  self.assertIsInstance(m1.repeated_bytes[0], bytes)
837  self.assertIsInstance(m1.optional_string, six.text_type)
838  self.assertIsInstance(m1.repeated_string[0], six.text_type)
839 
840  @unittest.skipIf(six.PY3, 'memoryview is supported by py3')
842  memview = memoryview(b'')
843  with self.assertRaises(TypeError):
844  message_module.TestAllTypes.FromString(memview)
845 
846  def testMergeFromEmpty(self, message_module):
847  m1 = message_module.TestAllTypes()
848  # Cpp extension will lazily create a sub message which is immutable.
849  self.assertEqual(0, m1.optional_nested_message.bb)
850  self.assertFalse(m1.HasField('optional_nested_message'))
851  # Make sure the sub message is still immutable after merge from empty.
852  m1.MergeFromString(b'') # field state should not change
853  self.assertFalse(m1.HasField('optional_nested_message'))
854 
855  def ensureNestedMessageExists(self, msg, attribute):
856  """Make sure that a nested message object exists.
857 
858  As soon as a nested message attribute is accessed, it will be present in the
859  _fields dict, without being marked as actually being set.
860  """
861  getattr(msg, attribute)
862  self.assertFalse(msg.HasField(attribute))
863 
864  def testOneofGetCaseNonexistingField(self, message_module):
865  m = message_module.TestAllTypes()
866  self.assertRaises(ValueError, m.WhichOneof, 'no_such_oneof_field')
867  self.assertRaises(Exception, m.WhichOneof, 0)
868 
869  def testOneofDefaultValues(self, message_module):
870  m = message_module.TestAllTypes()
871  self.assertIs(None, m.WhichOneof('oneof_field'))
872  self.assertFalse(m.HasField('oneof_uint32'))
873 
874  # Oneof is set even when setting it to a default value.
875  m.oneof_uint32 = 0
876  self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
877  self.assertTrue(m.HasField('oneof_uint32'))
878  self.assertFalse(m.HasField('oneof_string'))
879 
880  m.oneof_string = ""
881  self.assertEqual('oneof_string', m.WhichOneof('oneof_field'))
882  self.assertTrue(m.HasField('oneof_string'))
883  self.assertFalse(m.HasField('oneof_uint32'))
884 
885  def testOneofSemantics(self, message_module):
886  m = message_module.TestAllTypes()
887  self.assertIs(None, m.WhichOneof('oneof_field'))
888 
889  m.oneof_uint32 = 11
890  self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
891  self.assertTrue(m.HasField('oneof_uint32'))
892 
893  m.oneof_string = u'foo'
894  self.assertEqual('oneof_string', m.WhichOneof('oneof_field'))
895  self.assertFalse(m.HasField('oneof_uint32'))
896  self.assertTrue(m.HasField('oneof_string'))
897 
898  # Read nested message accessor without accessing submessage.
899  m.oneof_nested_message
900  self.assertEqual('oneof_string', m.WhichOneof('oneof_field'))
901  self.assertTrue(m.HasField('oneof_string'))
902  self.assertFalse(m.HasField('oneof_nested_message'))
903 
904  # Read accessor of nested message without accessing submessage.
905  m.oneof_nested_message.bb
906  self.assertEqual('oneof_string', m.WhichOneof('oneof_field'))
907  self.assertTrue(m.HasField('oneof_string'))
908  self.assertFalse(m.HasField('oneof_nested_message'))
909 
910  m.oneof_nested_message.bb = 11
911  self.assertEqual('oneof_nested_message', m.WhichOneof('oneof_field'))
912  self.assertFalse(m.HasField('oneof_string'))
913  self.assertTrue(m.HasField('oneof_nested_message'))
914 
915  m.oneof_bytes = b'bb'
916  self.assertEqual('oneof_bytes', m.WhichOneof('oneof_field'))
917  self.assertFalse(m.HasField('oneof_nested_message'))
918  self.assertTrue(m.HasField('oneof_bytes'))
919 
920  def testOneofCompositeFieldReadAccess(self, message_module):
921  m = message_module.TestAllTypes()
922  m.oneof_uint32 = 11
923 
924  self.ensureNestedMessageExists(m, 'oneof_nested_message')
925  self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
926  self.assertEqual(11, m.oneof_uint32)
927 
928  def testOneofWhichOneof(self, message_module):
929  m = message_module.TestAllTypes()
930  self.assertIs(None, m.WhichOneof('oneof_field'))
931  if message_module is unittest_pb2:
932  self.assertFalse(m.HasField('oneof_field'))
933 
934  m.oneof_uint32 = 11
935  self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
936  if message_module is unittest_pb2:
937  self.assertTrue(m.HasField('oneof_field'))
938 
939  m.oneof_bytes = b'bb'
940  self.assertEqual('oneof_bytes', m.WhichOneof('oneof_field'))
941 
942  m.ClearField('oneof_bytes')
943  self.assertIs(None, m.WhichOneof('oneof_field'))
944  if message_module is unittest_pb2:
945  self.assertFalse(m.HasField('oneof_field'))
946 
947  def testOneofClearField(self, message_module):
948  m = message_module.TestAllTypes()
949  m.oneof_uint32 = 11
950  m.ClearField('oneof_field')
951  if message_module is unittest_pb2:
952  self.assertFalse(m.HasField('oneof_field'))
953  self.assertFalse(m.HasField('oneof_uint32'))
954  self.assertIs(None, m.WhichOneof('oneof_field'))
955 
956  def testOneofClearSetField(self, message_module):
957  m = message_module.TestAllTypes()
958  m.oneof_uint32 = 11
959  m.ClearField('oneof_uint32')
960  if message_module is unittest_pb2:
961  self.assertFalse(m.HasField('oneof_field'))
962  self.assertFalse(m.HasField('oneof_uint32'))
963  self.assertIs(None, m.WhichOneof('oneof_field'))
964 
965  def testOneofClearUnsetField(self, message_module):
966  m = message_module.TestAllTypes()
967  m.oneof_uint32 = 11
968  self.ensureNestedMessageExists(m, 'oneof_nested_message')
969  m.ClearField('oneof_nested_message')
970  self.assertEqual(11, m.oneof_uint32)
971  if message_module is unittest_pb2:
972  self.assertTrue(m.HasField('oneof_field'))
973  self.assertTrue(m.HasField('oneof_uint32'))
974  self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
975 
976  def testOneofDeserialize(self, message_module):
977  m = message_module.TestAllTypes()
978  m.oneof_uint32 = 11
979  m2 = message_module.TestAllTypes()
980  m2.ParseFromString(m.SerializeToString())
981  self.assertEqual('oneof_uint32', m2.WhichOneof('oneof_field'))
982 
983  def testOneofCopyFrom(self, message_module):
984  m = message_module.TestAllTypes()
985  m.oneof_uint32 = 11
986  m2 = message_module.TestAllTypes()
987  m2.CopyFrom(m)
988  self.assertEqual('oneof_uint32', m2.WhichOneof('oneof_field'))
989 
990  def testOneofNestedMergeFrom(self, message_module):
991  m = message_module.NestedTestAllTypes()
992  m.payload.oneof_uint32 = 11
993  m2 = message_module.NestedTestAllTypes()
994  m2.payload.oneof_bytes = b'bb'
995  m2.child.payload.oneof_bytes = b'bb'
996  m2.MergeFrom(m)
997  self.assertEqual('oneof_uint32', m2.payload.WhichOneof('oneof_field'))
998  self.assertEqual('oneof_bytes', m2.child.payload.WhichOneof('oneof_field'))
999 
1000  def testOneofMessageMergeFrom(self, message_module):
1001  m = message_module.NestedTestAllTypes()
1002  m.payload.oneof_nested_message.bb = 11
1003  m.child.payload.oneof_nested_message.bb = 12
1004  m2 = message_module.NestedTestAllTypes()
1005  m2.payload.oneof_uint32 = 13
1006  m2.MergeFrom(m)
1007  self.assertEqual('oneof_nested_message',
1008  m2.payload.WhichOneof('oneof_field'))
1009  self.assertEqual('oneof_nested_message',
1010  m2.child.payload.WhichOneof('oneof_field'))
1011 
1012  def testOneofNestedMessageInit(self, message_module):
1013  m = message_module.TestAllTypes(
1014  oneof_nested_message=message_module.TestAllTypes.NestedMessage())
1015  self.assertEqual('oneof_nested_message', m.WhichOneof('oneof_field'))
1016 
1017  def testOneofClear(self, message_module):
1018  m = message_module.TestAllTypes()
1019  m.oneof_uint32 = 11
1020  m.Clear()
1021  self.assertIsNone(m.WhichOneof('oneof_field'))
1022  m.oneof_bytes = b'bb'
1023  self.assertEqual('oneof_bytes', m.WhichOneof('oneof_field'))
1024 
1025  def testAssignByteStringToUnicodeField(self, message_module):
1026  """Assigning a byte string to a string field should result
1027  in the value being converted to a Unicode string."""
1028  m = message_module.TestAllTypes()
1029  m.optional_string = str('')
1030  self.assertIsInstance(m.optional_string, six.text_type)
1031 
1032  def testLongValuedSlice(self, message_module):
1033  """It should be possible to use long-valued indicies in slices
1034 
1035  This didn't used to work in the v2 C++ implementation.
1036  """
1037  m = message_module.TestAllTypes()
1038 
1039  # Repeated scalar
1040  m.repeated_int32.append(1)
1041  sl = m.repeated_int32[long(0):long(len(m.repeated_int32))]
1042  self.assertEqual(len(m.repeated_int32), len(sl))
1043 
1044  # Repeated composite
1045  m.repeated_nested_message.add().bb = 3
1046  sl = m.repeated_nested_message[long(0):long(len(m.repeated_nested_message))]
1047  self.assertEqual(len(m.repeated_nested_message), len(sl))
1048 
1049  def testExtendShouldNotSwallowExceptions(self, message_module):
1050  """This didn't use to work in the v2 C++ implementation."""
1051  m = message_module.TestAllTypes()
1052  with self.assertRaises(NameError) as _:
1053  m.repeated_int32.extend(a for i in range(10)) # pylint: disable=undefined-variable
1054  with self.assertRaises(NameError) as _:
1055  m.repeated_nested_enum.extend(
1056  a for i in range(10)) # pylint: disable=undefined-variable
1057 
1058  FALSY_VALUES = [None, False, 0, 0.0, b'', u'', bytearray(), [], {}, set()]
1059 
1060  def testExtendInt32WithNothing(self, message_module):
1061  """Test no-ops extending repeated int32 fields."""
1062  m = message_module.TestAllTypes()
1063  self.assertSequenceEqual([], m.repeated_int32)
1064 
1065  # TODO(ptucker): Deprecate this behavior. b/18413862
1066  for falsy_value in MessageTest.FALSY_VALUES:
1067  m.repeated_int32.extend(falsy_value)
1068  self.assertSequenceEqual([], m.repeated_int32)
1069 
1070  m.repeated_int32.extend([])
1071  self.assertSequenceEqual([], m.repeated_int32)
1072 
1073  def testExtendFloatWithNothing(self, message_module):
1074  """Test no-ops extending repeated float fields."""
1075  m = message_module.TestAllTypes()
1076  self.assertSequenceEqual([], m.repeated_float)
1077 
1078  # TODO(ptucker): Deprecate this behavior. b/18413862
1079  for falsy_value in MessageTest.FALSY_VALUES:
1080  m.repeated_float.extend(falsy_value)
1081  self.assertSequenceEqual([], m.repeated_float)
1082 
1083  m.repeated_float.extend([])
1084  self.assertSequenceEqual([], m.repeated_float)
1085 
1086  def testExtendStringWithNothing(self, message_module):
1087  """Test no-ops extending repeated string fields."""
1088  m = message_module.TestAllTypes()
1089  self.assertSequenceEqual([], m.repeated_string)
1090 
1091  # TODO(ptucker): Deprecate this behavior. b/18413862
1092  for falsy_value in MessageTest.FALSY_VALUES:
1093  m.repeated_string.extend(falsy_value)
1094  self.assertSequenceEqual([], m.repeated_string)
1095 
1096  m.repeated_string.extend([])
1097  self.assertSequenceEqual([], m.repeated_string)
1098 
1099  def testExtendInt32WithPythonList(self, message_module):
1100  """Test extending repeated int32 fields with python lists."""
1101  m = message_module.TestAllTypes()
1102  self.assertSequenceEqual([], m.repeated_int32)
1103  m.repeated_int32.extend([0])
1104  self.assertSequenceEqual([0], m.repeated_int32)
1105  m.repeated_int32.extend([1, 2])
1106  self.assertSequenceEqual([0, 1, 2], m.repeated_int32)
1107  m.repeated_int32.extend([3, 4])
1108  self.assertSequenceEqual([0, 1, 2, 3, 4], m.repeated_int32)
1109 
1110  def testExtendFloatWithPythonList(self, message_module):
1111  """Test extending repeated float fields with python lists."""
1112  m = message_module.TestAllTypes()
1113  self.assertSequenceEqual([], m.repeated_float)
1114  m.repeated_float.extend([0.0])
1115  self.assertSequenceEqual([0.0], m.repeated_float)
1116  m.repeated_float.extend([1.0, 2.0])
1117  self.assertSequenceEqual([0.0, 1.0, 2.0], m.repeated_float)
1118  m.repeated_float.extend([3.0, 4.0])
1119  self.assertSequenceEqual([0.0, 1.0, 2.0, 3.0, 4.0], m.repeated_float)
1120 
1121  def testExtendStringWithPythonList(self, message_module):
1122  """Test extending repeated string fields with python lists."""
1123  m = message_module.TestAllTypes()
1124  self.assertSequenceEqual([], m.repeated_string)
1125  m.repeated_string.extend([''])
1126  self.assertSequenceEqual([''], m.repeated_string)
1127  m.repeated_string.extend(['11', '22'])
1128  self.assertSequenceEqual(['', '11', '22'], m.repeated_string)
1129  m.repeated_string.extend(['33', '44'])
1130  self.assertSequenceEqual(['', '11', '22', '33', '44'], m.repeated_string)
1131 
1132  def testExtendStringWithString(self, message_module):
1133  """Test extending repeated string fields with characters from a string."""
1134  m = message_module.TestAllTypes()
1135  self.assertSequenceEqual([], m.repeated_string)
1136  m.repeated_string.extend('abc')
1137  self.assertSequenceEqual(['a', 'b', 'c'], m.repeated_string)
1138 
1139  class TestIterable(object):
1140  """This iterable object mimics the behavior of numpy.array.
1141 
1142  __nonzero__ fails for length > 1, and returns bool(item[0]) for length == 1.
1143 
1144  """
1145 
1146  def __init__(self, values=None):
1147  self._list = values or []
1148 
1149  def __nonzero__(self):
1150  size = len(self._list)
1151  if size == 0:
1152  return False
1153  if size == 1:
1154  return bool(self._list[0])
1155  raise ValueError('Truth value is ambiguous.')
1156 
1157  def __len__(self):
1158  return len(self._list)
1159 
1160  def __iter__(self):
1161  return self._list.__iter__()
1162 
1163  def testExtendInt32WithIterable(self, message_module):
1164  """Test extending repeated int32 fields with iterable."""
1165  m = message_module.TestAllTypes()
1166  self.assertSequenceEqual([], m.repeated_int32)
1167  m.repeated_int32.extend(MessageTest.TestIterable([]))
1168  self.assertSequenceEqual([], m.repeated_int32)
1169  m.repeated_int32.extend(MessageTest.TestIterable([0]))
1170  self.assertSequenceEqual([0], m.repeated_int32)
1171  m.repeated_int32.extend(MessageTest.TestIterable([1, 2]))
1172  self.assertSequenceEqual([0, 1, 2], m.repeated_int32)
1173  m.repeated_int32.extend(MessageTest.TestIterable([3, 4]))
1174  self.assertSequenceEqual([0, 1, 2, 3, 4], m.repeated_int32)
1175 
1176  def testExtendFloatWithIterable(self, message_module):
1177  """Test extending repeated float fields with iterable."""
1178  m = message_module.TestAllTypes()
1179  self.assertSequenceEqual([], m.repeated_float)
1180  m.repeated_float.extend(MessageTest.TestIterable([]))
1181  self.assertSequenceEqual([], m.repeated_float)
1182  m.repeated_float.extend(MessageTest.TestIterable([0.0]))
1183  self.assertSequenceEqual([0.0], m.repeated_float)
1184  m.repeated_float.extend(MessageTest.TestIterable([1.0, 2.0]))
1185  self.assertSequenceEqual([0.0, 1.0, 2.0], m.repeated_float)
1186  m.repeated_float.extend(MessageTest.TestIterable([3.0, 4.0]))
1187  self.assertSequenceEqual([0.0, 1.0, 2.0, 3.0, 4.0], m.repeated_float)
1188 
1189  def testExtendStringWithIterable(self, message_module):
1190  """Test extending repeated string fields with iterable."""
1191  m = message_module.TestAllTypes()
1192  self.assertSequenceEqual([], m.repeated_string)
1193  m.repeated_string.extend(MessageTest.TestIterable([]))
1194  self.assertSequenceEqual([], m.repeated_string)
1195  m.repeated_string.extend(MessageTest.TestIterable(['']))
1196  self.assertSequenceEqual([''], m.repeated_string)
1197  m.repeated_string.extend(MessageTest.TestIterable(['1', '2']))
1198  self.assertSequenceEqual(['', '1', '2'], m.repeated_string)
1199  m.repeated_string.extend(MessageTest.TestIterable(['3', '4']))
1200  self.assertSequenceEqual(['', '1', '2', '3', '4'], m.repeated_string)
1201 
1202  def testPickleRepeatedScalarContainer(self, message_module):
1203  # TODO(tibell): The pure-Python implementation support pickling of
1204  # scalar containers in *some* cases. For now the cpp2 version
1205  # throws an exception to avoid a segfault. Investigate if we
1206  # want to support pickling of these fields.
1207  #
1208  # For more information see: https://b2.corp.google.com/u/0/issues/18677897
1209  if (api_implementation.Type() != 'cpp' or
1210  api_implementation.Version() == 2):
1211  return
1212  m = message_module.TestAllTypes()
1213  with self.assertRaises(pickle.PickleError) as _:
1214  pickle.dumps(m.repeated_int32, pickle.HIGHEST_PROTOCOL)
1215 
1216  def testSortEmptyRepeatedCompositeContainer(self, message_module):
1217  """Exercise a scenario that has led to segfaults in the past.
1218  """
1219  m = message_module.TestAllTypes()
1220  m.repeated_nested_message.sort()
1221 
1222  def testHasFieldOnRepeatedField(self, message_module):
1223  """Using HasField on a repeated field should raise an exception.
1224  """
1225  m = message_module.TestAllTypes()
1226  with self.assertRaises(ValueError) as _:
1227  m.HasField('repeated_int32')
1228 
1229  def testRepeatedScalarFieldPop(self, message_module):
1230  m = message_module.TestAllTypes()
1231  with self.assertRaises(IndexError) as _:
1232  m.repeated_int32.pop()
1233  m.repeated_int32.extend(range(5))
1234  self.assertEqual(4, m.repeated_int32.pop())
1235  self.assertEqual(0, m.repeated_int32.pop(0))
1236  self.assertEqual(2, m.repeated_int32.pop(1))
1237  self.assertEqual([1, 3], m.repeated_int32)
1238 
1239  def testRepeatedCompositeFieldPop(self, message_module):
1240  m = message_module.TestAllTypes()
1241  with self.assertRaises(IndexError) as _:
1242  m.repeated_nested_message.pop()
1243  with self.assertRaises(TypeError) as _:
1244  m.repeated_nested_message.pop('0')
1245  for i in range(5):
1246  n = m.repeated_nested_message.add()
1247  n.bb = i
1248  self.assertEqual(4, m.repeated_nested_message.pop().bb)
1249  self.assertEqual(0, m.repeated_nested_message.pop(0).bb)
1250  self.assertEqual(2, m.repeated_nested_message.pop(1).bb)
1251  self.assertEqual([1, 3], [n.bb for n in m.repeated_nested_message])
1252 
1253  def testRepeatedCompareWithSelf(self, message_module):
1254  m = message_module.TestAllTypes()
1255  for i in range(5):
1256  m.repeated_int32.insert(i, i)
1257  n = m.repeated_nested_message.add()
1258  n.bb = i
1259  self.assertSequenceEqual(m.repeated_int32, m.repeated_int32)
1260  self.assertEqual(m.repeated_nested_message, m.repeated_nested_message)
1261 
1262  def testReleasedNestedMessages(self, message_module):
1263  """A case that lead to a segfault when a message detached from its parent
1264  container has itself a child container.
1265  """
1266  m = message_module.NestedTestAllTypes()
1267  m = m.repeated_child.add()
1268  m = m.child
1269  m = m.repeated_child.add()
1270  self.assertEqual(m.payload.optional_int32, 0)
1271 
1272  def testSetRepeatedComposite(self, message_module):
1273  m = message_module.TestAllTypes()
1274  with self.assertRaises(AttributeError):
1275  m.repeated_int32 = []
1276  m.repeated_int32.append(1)
1277  with self.assertRaises(AttributeError):
1278  m.repeated_int32 = []
1279 
1280  def testReturningType(self, message_module):
1281  m = message_module.TestAllTypes()
1282  self.assertEqual(float, type(m.optional_float))
1283  self.assertEqual(float, type(m.optional_double))
1284  self.assertEqual(bool, type(m.optional_bool))
1285  m.optional_float = 1
1286  m.optional_double = 1
1287  m.optional_bool = 1
1288  m.repeated_float.append(1)
1289  m.repeated_double.append(1)
1290  m.repeated_bool.append(1)
1291  m.ParseFromString(m.SerializeToString())
1292  self.assertEqual(float, type(m.optional_float))
1293  self.assertEqual(float, type(m.optional_double))
1294  self.assertEqual('1.0', str(m.optional_double))
1295  self.assertEqual(bool, type(m.optional_bool))
1296  self.assertEqual(float, type(m.repeated_float[0]))
1297  self.assertEqual(float, type(m.repeated_double[0]))
1298  self.assertEqual(bool, type(m.repeated_bool[0]))
1299  self.assertEqual(True, m.repeated_bool[0])
1300 
1301 
1302 # Class to test proto2-only features (required, extensions, etc.)
1303 @testing_refleaks.TestCase
1304 class Proto2Test(unittest.TestCase):
1305 
1307  message = unittest_pb2.TestAllTypes()
1308 
1309  self.assertFalse(message.HasField("optional_int32"))
1310  self.assertFalse(message.HasField("optional_bool"))
1311  self.assertFalse(message.HasField("optional_nested_message"))
1312 
1313  with self.assertRaises(ValueError):
1314  message.HasField("field_doesnt_exist")
1315 
1316  with self.assertRaises(ValueError):
1317  message.HasField("repeated_int32")
1318  with self.assertRaises(ValueError):
1319  message.HasField("repeated_nested_message")
1320 
1321  self.assertEqual(0, message.optional_int32)
1322  self.assertEqual(False, message.optional_bool)
1323  self.assertEqual(0, message.optional_nested_message.bb)
1324 
1325  # Fields are set even when setting the values to default values.
1326  message.optional_int32 = 0
1327  message.optional_bool = False
1328  message.optional_nested_message.bb = 0
1329  self.assertTrue(message.HasField("optional_int32"))
1330  self.assertTrue(message.HasField("optional_bool"))
1331  self.assertTrue(message.HasField("optional_nested_message"))
1332 
1333  # Set the fields to non-default values.
1334  message.optional_int32 = 5
1335  message.optional_bool = True
1336  message.optional_nested_message.bb = 15
1337 
1338  self.assertTrue(message.HasField(u"optional_int32"))
1339  self.assertTrue(message.HasField("optional_bool"))
1340  self.assertTrue(message.HasField("optional_nested_message"))
1341 
1342  # Clearing the fields unsets them and resets their value to default.
1343  message.ClearField("optional_int32")
1344  message.ClearField(u"optional_bool")
1345  message.ClearField("optional_nested_message")
1346 
1347  self.assertFalse(message.HasField("optional_int32"))
1348  self.assertFalse(message.HasField("optional_bool"))
1349  self.assertFalse(message.HasField("optional_nested_message"))
1350  self.assertEqual(0, message.optional_int32)
1351  self.assertEqual(False, message.optional_bool)
1352  self.assertEqual(0, message.optional_nested_message.bb)
1353 
1355  """Assigning an invalid enum number is not allowed in proto2."""
1356  m = unittest_pb2.TestAllTypes()
1357 
1358  # Proto2 can not assign unknown enum.
1359  with self.assertRaises(ValueError) as _:
1360  m.optional_nested_enum = 1234567
1361  self.assertRaises(ValueError, m.repeated_nested_enum.append, 1234567)
1362  # Assignment is a different code path than append for the C++ impl.
1363  m.repeated_nested_enum.append(2)
1364  m.repeated_nested_enum[0] = 2
1365  with self.assertRaises(ValueError):
1366  m.repeated_nested_enum[0] = 123456
1367 
1368  # Unknown enum value can be parsed but is ignored.
1369  m2 = unittest_proto3_arena_pb2.TestAllTypes()
1370  m2.optional_nested_enum = 1234567
1371  m2.repeated_nested_enum.append(7654321)
1372  serialized = m2.SerializeToString()
1373 
1374  m3 = unittest_pb2.TestAllTypes()
1375  m3.ParseFromString(serialized)
1376  self.assertFalse(m3.HasField('optional_nested_enum'))
1377  # 1 is the default value for optional_nested_enum.
1378  self.assertEqual(1, m3.optional_nested_enum)
1379  self.assertEqual(0, len(m3.repeated_nested_enum))
1380  m2.Clear()
1381  m2.ParseFromString(m3.SerializeToString())
1382  self.assertEqual(1234567, m2.optional_nested_enum)
1383  self.assertEqual(7654321, m2.repeated_nested_enum[0])
1384 
1386  m = map_proto2_unittest_pb2.TestEnumMap()
1387  m.known_map_field[123] = 0
1388  with self.assertRaises(ValueError):
1389  m.unknown_map_field[1] = 123
1390 
1392  msg = unittest_pb2.TestAllTypes()
1393  self.assertRaises(AttributeError, getattr, msg, 'Extensions')
1394 
1396  msg1 = more_extensions_pb2.TopLevelMessage()
1397  msg2 = more_extensions_pb2.TopLevelMessage()
1398  # Cpp extension will lazily create a sub message which is immutable.
1399  self.assertEqual(0, msg1.submessage.Extensions[
1400  more_extensions_pb2.optional_int_extension])
1401  self.assertFalse(msg1.HasField('submessage'))
1402  msg2.submessage.Extensions[
1403  more_extensions_pb2.optional_int_extension] = 123
1404  # Make sure cmessage and extensions pointing to a mutable message
1405  # after merge instead of the lazily created message.
1406  msg1.MergeFrom(msg2)
1407  self.assertEqual(123, msg1.submessage.Extensions[
1408  more_extensions_pb2.optional_int_extension])
1409 
1411  golden_data = test_util.GoldenFileData('golden_message')
1412  golden_message = unittest_pb2.TestAllExtensions()
1413  golden_message.ParseFromString(golden_data)
1414  all_set = unittest_pb2.TestAllExtensions()
1415  test_util.SetAllExtensions(all_set)
1416  self.assertEqual(all_set, golden_message)
1417  self.assertEqual(golden_data, golden_message.SerializeToString())
1418  golden_copy = copy.deepcopy(golden_message)
1419  self.assertEqual(golden_data, golden_copy.SerializeToString())
1420 
1422  golden_data = test_util.GoldenFileData('golden_packed_fields_message')
1423  golden_message = unittest_pb2.TestPackedExtensions()
1424  golden_message.ParseFromString(golden_data)
1425  all_set = unittest_pb2.TestPackedExtensions()
1426  test_util.SetAllPackedExtensions(all_set)
1427  self.assertEqual(all_set, golden_message)
1428  self.assertEqual(golden_data, all_set.SerializeToString())
1429  golden_copy = copy.deepcopy(golden_message)
1430  self.assertEqual(golden_data, golden_copy.SerializeToString())
1431 
1433  golden_message = unittest_pb2.TestRequired(a=1)
1434  pickled_message = pickle.dumps(golden_message)
1435 
1436  unpickled_message = pickle.loads(pickled_message)
1437  self.assertEqual(unpickled_message, golden_message)
1438  self.assertEqual(unpickled_message.a, 1)
1439  # This is still an incomplete proto - so serializing should fail
1440  self.assertRaises(message.EncodeError, unpickled_message.SerializeToString)
1441 
1442 
1443  # TODO(haberman): this isn't really a proto2-specific test except that this
1444  # message has a required field in it. Should probably be factored out so
1445  # that we can test the other parts with proto3.
1446  def testParsingMerge(self):
1447  """Check the merge behavior when a required or optional field appears
1448  multiple times in the input."""
1449  messages = [
1450  unittest_pb2.TestAllTypes(),
1451  unittest_pb2.TestAllTypes(),
1452  unittest_pb2.TestAllTypes() ]
1453  messages[0].optional_int32 = 1
1454  messages[1].optional_int64 = 2
1455  messages[2].optional_int32 = 3
1456  messages[2].optional_string = 'hello'
1457 
1458  merged_message = unittest_pb2.TestAllTypes()
1459  merged_message.optional_int32 = 3
1460  merged_message.optional_int64 = 2
1461  merged_message.optional_string = 'hello'
1462 
1463  generator = unittest_pb2.TestParsingMerge.RepeatedFieldsGenerator()
1464  generator.field1.extend(messages)
1465  generator.field2.extend(messages)
1466  generator.field3.extend(messages)
1467  generator.ext1.extend(messages)
1468  generator.ext2.extend(messages)
1469  generator.group1.add().field1.MergeFrom(messages[0])
1470  generator.group1.add().field1.MergeFrom(messages[1])
1471  generator.group1.add().field1.MergeFrom(messages[2])
1472  generator.group2.add().field1.MergeFrom(messages[0])
1473  generator.group2.add().field1.MergeFrom(messages[1])
1474  generator.group2.add().field1.MergeFrom(messages[2])
1475 
1476  data = generator.SerializeToString()
1477  parsing_merge = unittest_pb2.TestParsingMerge()
1478  parsing_merge.ParseFromString(data)
1479 
1480  # Required and optional fields should be merged.
1481  self.assertEqual(parsing_merge.required_all_types, merged_message)
1482  self.assertEqual(parsing_merge.optional_all_types, merged_message)
1483  self.assertEqual(parsing_merge.optionalgroup.optional_group_all_types,
1484  merged_message)
1485  self.assertEqual(parsing_merge.Extensions[
1486  unittest_pb2.TestParsingMerge.optional_ext],
1487  merged_message)
1488 
1489  # Repeated fields should not be merged.
1490  self.assertEqual(len(parsing_merge.repeated_all_types), 3)
1491  self.assertEqual(len(parsing_merge.repeatedgroup), 3)
1492  self.assertEqual(len(parsing_merge.Extensions[
1493  unittest_pb2.TestParsingMerge.repeated_ext]), 3)
1494 
1495  def testPythonicInit(self):
1496  message = unittest_pb2.TestAllTypes(
1497  optional_int32=100,
1498  optional_fixed32=200,
1499  optional_float=300.5,
1500  optional_bytes=b'x',
1501  optionalgroup={'a': 400},
1502  optional_nested_message={'bb': 500},
1503  optional_foreign_message={},
1504  optional_nested_enum='BAZ',
1505  repeatedgroup=[{'a': 600},
1506  {'a': 700}],
1507  repeated_nested_enum=['FOO', unittest_pb2.TestAllTypes.BAR],
1508  default_int32=800,
1509  oneof_string='y')
1510  self.assertIsInstance(message, unittest_pb2.TestAllTypes)
1511  self.assertEqual(100, message.optional_int32)
1512  self.assertEqual(200, message.optional_fixed32)
1513  self.assertEqual(300.5, message.optional_float)
1514  self.assertEqual(b'x', message.optional_bytes)
1515  self.assertEqual(400, message.optionalgroup.a)
1516  self.assertIsInstance(message.optional_nested_message,
1517  unittest_pb2.TestAllTypes.NestedMessage)
1518  self.assertEqual(500, message.optional_nested_message.bb)
1519  self.assertTrue(message.HasField('optional_foreign_message'))
1520  self.assertEqual(message.optional_foreign_message,
1521  unittest_pb2.ForeignMessage())
1522  self.assertEqual(unittest_pb2.TestAllTypes.BAZ,
1523  message.optional_nested_enum)
1524  self.assertEqual(2, len(message.repeatedgroup))
1525  self.assertEqual(600, message.repeatedgroup[0].a)
1526  self.assertEqual(700, message.repeatedgroup[1].a)
1527  self.assertEqual(2, len(message.repeated_nested_enum))
1528  self.assertEqual(unittest_pb2.TestAllTypes.FOO,
1529  message.repeated_nested_enum[0])
1530  self.assertEqual(unittest_pb2.TestAllTypes.BAR,
1531  message.repeated_nested_enum[1])
1532  self.assertEqual(800, message.default_int32)
1533  self.assertEqual('y', message.oneof_string)
1534  self.assertFalse(message.HasField('optional_int64'))
1535  self.assertEqual(0, len(message.repeated_float))
1536  self.assertEqual(42, message.default_int64)
1537 
1538  message = unittest_pb2.TestAllTypes(optional_nested_enum=u'BAZ')
1539  self.assertEqual(unittest_pb2.TestAllTypes.BAZ,
1540  message.optional_nested_enum)
1541 
1542  with self.assertRaises(ValueError):
1543  unittest_pb2.TestAllTypes(
1544  optional_nested_message={'INVALID_NESTED_FIELD': 17})
1545 
1546  with self.assertRaises(TypeError):
1547  unittest_pb2.TestAllTypes(
1548  optional_nested_message={'bb': 'INVALID_VALUE_TYPE'})
1549 
1550  with self.assertRaises(ValueError):
1551  unittest_pb2.TestAllTypes(optional_nested_enum='INVALID_LABEL')
1552 
1553  with self.assertRaises(ValueError):
1554  unittest_pb2.TestAllTypes(repeated_nested_enum='FOO')
1555 
1557  # Both string/unicode field name keys should work.
1558  kwargs = {
1559  'optional_int32': 100,
1560  u'optional_fixed32': 200,
1561  }
1562  msg = unittest_pb2.TestAllTypes(**kwargs)
1563  self.assertEqual(100, msg.optional_int32)
1564  self.assertEqual(200, msg.optional_fixed32)
1565 
1566 
1568  # Also used by the interactive help() function.
1569  doc = pydoc.html.document(unittest_pb2.TestAllTypes, 'message')
1570  self.assertIn('class TestAllTypes', doc)
1571  self.assertIn('SerializePartialToString', doc)
1572  self.assertIn('repeated_float', doc)
1573  base = unittest_pb2.TestAllTypes.__bases__[0]
1574  self.assertRaises(AttributeError, getattr, base, '_extensions_by_name')
1575 
1576 
1577 # Class to test proto3-only features/behavior (updated field presence & enums)
1578 @testing_refleaks.TestCase
1579 class Proto3Test(unittest.TestCase):
1580 
1581  # Utility method for comparing equality with a map.
1582  def assertMapIterEquals(self, map_iter, dict_value):
1583  # Avoid mutating caller's copy.
1584  dict_value = dict(dict_value)
1585 
1586  for k, v in map_iter:
1587  self.assertEqual(v, dict_value[k])
1588  del dict_value[k]
1589 
1590  self.assertEqual({}, dict_value)
1591 
1593  message = unittest_proto3_arena_pb2.TestAllTypes()
1594 
1595  # We can't test presence of non-repeated, non-submessage fields.
1596  with self.assertRaises(ValueError):
1597  message.HasField('optional_int32')
1598  with self.assertRaises(ValueError):
1599  message.HasField('optional_float')
1600  with self.assertRaises(ValueError):
1601  message.HasField('optional_string')
1602  with self.assertRaises(ValueError):
1603  message.HasField('optional_bool')
1604 
1605  # But we can still test presence of submessage fields.
1606  self.assertFalse(message.HasField('optional_nested_message'))
1607 
1608  # As with proto2, we can't test presence of fields that don't exist, or
1609  # repeated fields.
1610  with self.assertRaises(ValueError):
1611  message.HasField('field_doesnt_exist')
1612 
1613  with self.assertRaises(ValueError):
1614  message.HasField('repeated_int32')
1615  with self.assertRaises(ValueError):
1616  message.HasField('repeated_nested_message')
1617 
1618  # Fields should default to their type-specific default.
1619  self.assertEqual(0, message.optional_int32)
1620  self.assertEqual(0, message.optional_float)
1621  self.assertEqual('', message.optional_string)
1622  self.assertEqual(False, message.optional_bool)
1623  self.assertEqual(0, message.optional_nested_message.bb)
1624 
1625  # Setting a submessage should still return proper presence information.
1626  message.optional_nested_message.bb = 0
1627  self.assertTrue(message.HasField('optional_nested_message'))
1628 
1629  # Set the fields to non-default values.
1630  message.optional_int32 = 5
1631  message.optional_float = 1.1
1632  message.optional_string = 'abc'
1633  message.optional_bool = True
1634  message.optional_nested_message.bb = 15
1635 
1636  # Clearing the fields unsets them and resets their value to default.
1637  message.ClearField('optional_int32')
1638  message.ClearField('optional_float')
1639  message.ClearField('optional_string')
1640  message.ClearField('optional_bool')
1641  message.ClearField('optional_nested_message')
1642 
1643  self.assertEqual(0, message.optional_int32)
1644  self.assertEqual(0, message.optional_float)
1645  self.assertEqual('', message.optional_string)
1646  self.assertEqual(False, message.optional_bool)
1647  self.assertEqual(0, message.optional_nested_message.bb)
1648 
1650  """Assigning an unknown enum value is allowed and preserves the value."""
1651  m = unittest_proto3_arena_pb2.TestAllTypes()
1652 
1653  # Proto3 can assign unknown enums.
1654  m.optional_nested_enum = 1234567
1655  self.assertEqual(1234567, m.optional_nested_enum)
1656  m.repeated_nested_enum.append(22334455)
1657  self.assertEqual(22334455, m.repeated_nested_enum[0])
1658  # Assignment is a different code path than append for the C++ impl.
1659  m.repeated_nested_enum[0] = 7654321
1660  self.assertEqual(7654321, m.repeated_nested_enum[0])
1661  serialized = m.SerializeToString()
1662 
1663  m2 = unittest_proto3_arena_pb2.TestAllTypes()
1664  m2.ParseFromString(serialized)
1665  self.assertEqual(1234567, m2.optional_nested_enum)
1666  self.assertEqual(7654321, m2.repeated_nested_enum[0])
1667 
1668  # Map isn't really a proto3-only feature. But there is no proto2 equivalent
1669  # of google/protobuf/map_unittest.proto right now, so it's not easy to
1670  # test both with the same test like we do for the other proto2/proto3 tests.
1671  # (google/protobuf/map_proto2_unittest.proto is very different in the set
1672  # of messages and fields it contains).
1674  msg = map_unittest_pb2.TestMap()
1675 
1676  # Scalars start out unset.
1677  self.assertFalse(-123 in msg.map_int32_int32)
1678  self.assertFalse(-2**33 in msg.map_int64_int64)
1679  self.assertFalse(123 in msg.map_uint32_uint32)
1680  self.assertFalse(2**33 in msg.map_uint64_uint64)
1681  self.assertFalse(123 in msg.map_int32_double)
1682  self.assertFalse(False in msg.map_bool_bool)
1683  self.assertFalse('abc' in msg.map_string_string)
1684  self.assertFalse(111 in msg.map_int32_bytes)
1685  self.assertFalse(888 in msg.map_int32_enum)
1686 
1687  # Accessing an unset key returns the default.
1688  self.assertEqual(0, msg.map_int32_int32[-123])
1689  self.assertEqual(0, msg.map_int64_int64[-2**33])
1690  self.assertEqual(0, msg.map_uint32_uint32[123])
1691  self.assertEqual(0, msg.map_uint64_uint64[2**33])
1692  self.assertEqual(0.0, msg.map_int32_double[123])
1693  self.assertTrue(isinstance(msg.map_int32_double[123], float))
1694  self.assertEqual(False, msg.map_bool_bool[False])
1695  self.assertTrue(isinstance(msg.map_bool_bool[False], bool))
1696  self.assertEqual('', msg.map_string_string['abc'])
1697  self.assertEqual(b'', msg.map_int32_bytes[111])
1698  self.assertEqual(0, msg.map_int32_enum[888])
1699 
1700  # It also sets the value in the map
1701  self.assertTrue(-123 in msg.map_int32_int32)
1702  self.assertTrue(-2**33 in msg.map_int64_int64)
1703  self.assertTrue(123 in msg.map_uint32_uint32)
1704  self.assertTrue(2**33 in msg.map_uint64_uint64)
1705  self.assertTrue(123 in msg.map_int32_double)
1706  self.assertTrue(False in msg.map_bool_bool)
1707  self.assertTrue('abc' in msg.map_string_string)
1708  self.assertTrue(111 in msg.map_int32_bytes)
1709  self.assertTrue(888 in msg.map_int32_enum)
1710 
1711  self.assertIsInstance(msg.map_string_string['abc'], six.text_type)
1712 
1713  # Accessing an unset key still throws TypeError if the type of the key
1714  # is incorrect.
1715  with self.assertRaises(TypeError):
1716  msg.map_string_string[123]
1717 
1718  with self.assertRaises(TypeError):
1719  123 in msg.map_string_string
1720 
1721  def testMapGet(self):
1722  # Need to test that get() properly returns the default, even though the dict
1723  # has defaultdict-like semantics.
1724  msg = map_unittest_pb2.TestMap()
1725 
1726  self.assertIsNone(msg.map_int32_int32.get(5))
1727  self.assertEqual(10, msg.map_int32_int32.get(5, 10))
1728  self.assertEqual(10, msg.map_int32_int32.get(key=5, default=10))
1729  self.assertIsNone(msg.map_int32_int32.get(5))
1730 
1731  msg.map_int32_int32[5] = 15
1732  self.assertEqual(15, msg.map_int32_int32.get(5))
1733  self.assertEqual(15, msg.map_int32_int32.get(5))
1734  with self.assertRaises(TypeError):
1735  msg.map_int32_int32.get('')
1736 
1737  self.assertIsNone(msg.map_int32_foreign_message.get(5))
1738  self.assertEqual(10, msg.map_int32_foreign_message.get(5, 10))
1739  self.assertEqual(10, msg.map_int32_foreign_message.get(key=5, default=10))
1740 
1741  submsg = msg.map_int32_foreign_message[5]
1742  self.assertIs(submsg, msg.map_int32_foreign_message.get(5))
1743  with self.assertRaises(TypeError):
1744  msg.map_int32_foreign_message.get('')
1745 
1746  def testScalarMap(self):
1747  msg = map_unittest_pb2.TestMap()
1748 
1749  self.assertEqual(0, len(msg.map_int32_int32))
1750  self.assertFalse(5 in msg.map_int32_int32)
1751 
1752  msg.map_int32_int32[-123] = -456
1753  msg.map_int64_int64[-2**33] = -2**34
1754  msg.map_uint32_uint32[123] = 456
1755  msg.map_uint64_uint64[2**33] = 2**34
1756  msg.map_int32_float[2] = 1.2
1757  msg.map_int32_double[1] = 3.3
1758  msg.map_string_string['abc'] = '123'
1759  msg.map_bool_bool[True] = True
1760  msg.map_int32_enum[888] = 2
1761  # Unknown numeric enum is supported in proto3.
1762  msg.map_int32_enum[123] = 456
1763 
1764  self.assertEqual([], msg.FindInitializationErrors())
1765 
1766  self.assertEqual(1, len(msg.map_string_string))
1767 
1768  # Bad key.
1769  with self.assertRaises(TypeError):
1770  msg.map_string_string[123] = '123'
1771 
1772  # Verify that trying to assign a bad key doesn't actually add a member to
1773  # the map.
1774  self.assertEqual(1, len(msg.map_string_string))
1775 
1776  # Bad value.
1777  with self.assertRaises(TypeError):
1778  msg.map_string_string['123'] = 123
1779 
1780  serialized = msg.SerializeToString()
1781  msg2 = map_unittest_pb2.TestMap()
1782  msg2.ParseFromString(serialized)
1783 
1784  # Bad key.
1785  with self.assertRaises(TypeError):
1786  msg2.map_string_string[123] = '123'
1787 
1788  # Bad value.
1789  with self.assertRaises(TypeError):
1790  msg2.map_string_string['123'] = 123
1791 
1792  self.assertEqual(-456, msg2.map_int32_int32[-123])
1793  self.assertEqual(-2**34, msg2.map_int64_int64[-2**33])
1794  self.assertEqual(456, msg2.map_uint32_uint32[123])
1795  self.assertEqual(2**34, msg2.map_uint64_uint64[2**33])
1796  self.assertAlmostEqual(1.2, msg.map_int32_float[2])
1797  self.assertEqual(3.3, msg.map_int32_double[1])
1798  self.assertEqual('123', msg2.map_string_string['abc'])
1799  self.assertEqual(True, msg2.map_bool_bool[True])
1800  self.assertEqual(2, msg2.map_int32_enum[888])
1801  self.assertEqual(456, msg2.map_int32_enum[123])
1802  self.assertEqual('{-123: -456}',
1803  str(msg2.map_int32_int32))
1804 
1806  msg = map_unittest_pb2.TestMap()
1807  msg.map_int32_int32[0] = 0
1808  msg.map_string_string[''] = ''
1809  self.assertEqual(msg.ByteSize(), 12)
1810  self.assertEqual(b'\n\x04\x08\x00\x10\x00r\x04\n\x00\x12\x00',
1811  msg.SerializeToString())
1812 
1814  msg = map_unittest_pb2.TestMap()
1815 
1816  unicode_obj = u'\u1234'
1817  bytes_obj = unicode_obj.encode('utf8')
1818 
1819  msg.map_string_string[bytes_obj] = bytes_obj
1820 
1821  (key, value) = list(msg.map_string_string.items())[0]
1822 
1823  self.assertEqual(key, unicode_obj)
1824  self.assertEqual(value, unicode_obj)
1825 
1826  self.assertIsInstance(key, six.text_type)
1827  self.assertIsInstance(value, six.text_type)
1828 
1829  def testMessageMap(self):
1830  msg = map_unittest_pb2.TestMap()
1831 
1832  self.assertEqual(0, len(msg.map_int32_foreign_message))
1833  self.assertFalse(5 in msg.map_int32_foreign_message)
1834 
1835  msg.map_int32_foreign_message[123]
1836  # get_or_create() is an alias for getitem.
1837  msg.map_int32_foreign_message.get_or_create(-456)
1838 
1839  self.assertEqual(2, len(msg.map_int32_foreign_message))
1840  self.assertIn(123, msg.map_int32_foreign_message)
1841  self.assertIn(-456, msg.map_int32_foreign_message)
1842  self.assertEqual(2, len(msg.map_int32_foreign_message))
1843 
1844  # Bad key.
1845  with self.assertRaises(TypeError):
1846  msg.map_int32_foreign_message['123']
1847 
1848  # Can't assign directly to submessage.
1849  with self.assertRaises(ValueError):
1850  msg.map_int32_foreign_message[999] = msg.map_int32_foreign_message[123]
1851 
1852  # Verify that trying to assign a bad key doesn't actually add a member to
1853  # the map.
1854  self.assertEqual(2, len(msg.map_int32_foreign_message))
1855 
1856  serialized = msg.SerializeToString()
1857  msg2 = map_unittest_pb2.TestMap()
1858  msg2.ParseFromString(serialized)
1859 
1860  self.assertEqual(2, len(msg2.map_int32_foreign_message))
1861  self.assertIn(123, msg2.map_int32_foreign_message)
1862  self.assertIn(-456, msg2.map_int32_foreign_message)
1863  self.assertEqual(2, len(msg2.map_int32_foreign_message))
1864  msg2.map_int32_foreign_message[123].c = 1
1865  # TODO(jieluo): Fix text format for message map.
1866  self.assertIn(str(msg2.map_int32_foreign_message),
1867  ('{-456: , 123: c: 1\n}', '{123: c: 1\n, -456: }'))
1868 
1870  msg = map_unittest_pb2.TestMap()
1871  msg.map_int32_all_types[1].optional_nested_message.bb = 1
1872  del msg.map_int32_all_types[1]
1873  msg.map_int32_all_types[2].optional_nested_message.bb = 2
1874  self.assertEqual(1, len(msg.map_int32_all_types))
1875  msg.map_int32_all_types[1].optional_nested_message.bb = 1
1876  self.assertEqual(2, len(msg.map_int32_all_types))
1877 
1878  serialized = msg.SerializeToString()
1879  msg2 = map_unittest_pb2.TestMap()
1880  msg2.ParseFromString(serialized)
1881  keys = [1, 2]
1882  # The loop triggers PyErr_Occurred() in c extension.
1883  for key in keys:
1884  del msg2.map_int32_all_types[key]
1885 
1886  def testMapByteSize(self):
1887  msg = map_unittest_pb2.TestMap()
1888  msg.map_int32_int32[1] = 1
1889  size = msg.ByteSize()
1890  msg.map_int32_int32[1] = 128
1891  self.assertEqual(msg.ByteSize(), size + 1)
1892 
1893  msg.map_int32_foreign_message[19].c = 1
1894  size = msg.ByteSize()
1895  msg.map_int32_foreign_message[19].c = 128
1896  self.assertEqual(msg.ByteSize(), size + 1)
1897 
1898  def testMergeFrom(self):
1899  msg = map_unittest_pb2.TestMap()
1900  msg.map_int32_int32[12] = 34
1901  msg.map_int32_int32[56] = 78
1902  msg.map_int64_int64[22] = 33
1903  msg.map_int32_foreign_message[111].c = 5
1904  msg.map_int32_foreign_message[222].c = 10
1905 
1906  msg2 = map_unittest_pb2.TestMap()
1907  msg2.map_int32_int32[12] = 55
1908  msg2.map_int64_int64[88] = 99
1909  msg2.map_int32_foreign_message[222].c = 15
1910  msg2.map_int32_foreign_message[222].d = 20
1911  old_map_value = msg2.map_int32_foreign_message[222]
1912 
1913  msg2.MergeFrom(msg)
1914  # Compare with expected message instead of call
1915  # msg2.map_int32_foreign_message[222] to make sure MergeFrom does not
1916  # sync with repeated field and there is no duplicated keys.
1917  expected_msg = map_unittest_pb2.TestMap()
1918  expected_msg.CopyFrom(msg)
1919  expected_msg.map_int64_int64[88] = 99
1920  self.assertEqual(msg2, expected_msg)
1921 
1922  self.assertEqual(34, msg2.map_int32_int32[12])
1923  self.assertEqual(78, msg2.map_int32_int32[56])
1924  self.assertEqual(33, msg2.map_int64_int64[22])
1925  self.assertEqual(99, msg2.map_int64_int64[88])
1926  self.assertEqual(5, msg2.map_int32_foreign_message[111].c)
1927  self.assertEqual(10, msg2.map_int32_foreign_message[222].c)
1928  self.assertFalse(msg2.map_int32_foreign_message[222].HasField('d'))
1929  if api_implementation.Type() != 'cpp':
1930  # During the call to MergeFrom(), the C++ implementation will have
1931  # deallocated the underlying message, but this is very difficult to detect
1932  # properly. The line below is likely to cause a segmentation fault.
1933  # With the Python implementation, old_map_value is just 'detached' from
1934  # the main message. Using it will not crash of course, but since it still
1935  # have a reference to the parent message I'm sure we can find interesting
1936  # ways to cause inconsistencies.
1937  self.assertEqual(15, old_map_value.c)
1938 
1939  # Verify that there is only one entry per key, even though the MergeFrom
1940  # may have internally created multiple entries for a single key in the
1941  # list representation.
1942  as_dict = {}
1943  for key in msg2.map_int32_foreign_message:
1944  self.assertFalse(key in as_dict)
1945  as_dict[key] = msg2.map_int32_foreign_message[key].c
1946 
1947  self.assertEqual({111: 5, 222: 10}, as_dict)
1948 
1949  # Special case: test that delete of item really removes the item, even if
1950  # there might have physically been duplicate keys due to the previous merge.
1951  # This is only a special case for the C++ implementation which stores the
1952  # map as an array.
1953  del msg2.map_int32_int32[12]
1954  self.assertFalse(12 in msg2.map_int32_int32)
1955 
1956  del msg2.map_int32_foreign_message[222]
1957  self.assertFalse(222 in msg2.map_int32_foreign_message)
1958  with self.assertRaises(TypeError):
1959  del msg2.map_int32_foreign_message['']
1960 
1961  def testMapMergeFrom(self):
1962  msg = map_unittest_pb2.TestMap()
1963  msg.map_int32_int32[12] = 34
1964  msg.map_int32_int32[56] = 78
1965  msg.map_int64_int64[22] = 33
1966  msg.map_int32_foreign_message[111].c = 5
1967  msg.map_int32_foreign_message[222].c = 10
1968 
1969  msg2 = map_unittest_pb2.TestMap()
1970  msg2.map_int32_int32[12] = 55
1971  msg2.map_int64_int64[88] = 99
1972  msg2.map_int32_foreign_message[222].c = 15
1973  msg2.map_int32_foreign_message[222].d = 20
1974 
1975  msg2.map_int32_int32.MergeFrom(msg.map_int32_int32)
1976  self.assertEqual(34, msg2.map_int32_int32[12])
1977  self.assertEqual(78, msg2.map_int32_int32[56])
1978 
1979  msg2.map_int64_int64.MergeFrom(msg.map_int64_int64)
1980  self.assertEqual(33, msg2.map_int64_int64[22])
1981  self.assertEqual(99, msg2.map_int64_int64[88])
1982 
1983  msg2.map_int32_foreign_message.MergeFrom(msg.map_int32_foreign_message)
1984  # Compare with expected message instead of call
1985  # msg.map_int32_foreign_message[222] to make sure MergeFrom does not
1986  # sync with repeated field and no duplicated keys.
1987  expected_msg = map_unittest_pb2.TestMap()
1988  expected_msg.CopyFrom(msg)
1989  expected_msg.map_int64_int64[88] = 99
1990  self.assertEqual(msg2, expected_msg)
1991 
1992  # Test when cpp extension cache a map.
1993  m1 = map_unittest_pb2.TestMap()
1994  m2 = map_unittest_pb2.TestMap()
1995  self.assertEqual(m1.map_int32_foreign_message,
1996  m1.map_int32_foreign_message)
1997  m2.map_int32_foreign_message[123].c = 10
1998  m1.MergeFrom(m2)
1999  self.assertEqual(10, m2.map_int32_foreign_message[123].c)
2000 
2002  msg = map_unittest_pb2.TestMap()
2003  with self.assertRaisesRegexp(
2004  TypeError,
2005  r'Parameter to MergeFrom\(\) must be instance of same class: expected '
2006  r'.*TestMap got int\.'):
2007  msg.MergeFrom(1)
2008 
2010  msg = map_unittest_pb2.TestMap()
2011  with self.assertRaisesRegexp(
2012  TypeError,
2013  r'Parameter to [A-Za-z]*From\(\) must be instance of same class: '
2014  r'expected .*TestMap got int\.'):
2015  msg.CopyFrom(1)
2016 
2018  msg = map_unittest_pb2.TestMap()
2019  msg.map_int32_int32[long(-123)] = long(-456)
2020  msg.map_int64_int64[long(-2**33)] = long(-2**34)
2021  msg.map_uint32_uint32[long(123)] = long(456)
2022  msg.map_uint64_uint64[long(2**33)] = long(2**34)
2023 
2024  serialized = msg.SerializeToString()
2025  msg2 = map_unittest_pb2.TestMap()
2026  msg2.ParseFromString(serialized)
2027 
2028  self.assertEqual(-456, msg2.map_int32_int32[-123])
2029  self.assertEqual(-2**34, msg2.map_int64_int64[-2**33])
2030  self.assertEqual(456, msg2.map_uint32_uint32[123])
2031  self.assertEqual(2**34, msg2.map_uint64_uint64[2**33])
2032 
2034  msg = map_unittest_pb2.TestMapSubmessage()
2035  msg.test_map.map_int32_int32[123] = 456
2036 
2037  serialized = msg.SerializeToString()
2038  msg2 = map_unittest_pb2.TestMapSubmessage()
2039  msg2.ParseFromString(serialized)
2040 
2041  self.assertEqual(msg, msg2)
2042 
2043  # Now test that various mutations of the map properly invalidate the
2044  # cached size of the submessage.
2045  msg.test_map.map_int32_int32[888] = 999
2046  serialized = msg.SerializeToString()
2047  msg2.ParseFromString(serialized)
2048  self.assertEqual(msg, msg2)
2049 
2050  msg.test_map.map_int32_int32.clear()
2051  serialized = msg.SerializeToString()
2052  msg2.ParseFromString(serialized)
2053  self.assertEqual(msg, msg2)
2054 
2056  msg = map_unittest_pb2.TestMapSubmessage()
2057  msg.test_map.map_int32_foreign_message[123].c = 5
2058 
2059  serialized = msg.SerializeToString()
2060  msg2 = map_unittest_pb2.TestMapSubmessage()
2061  msg2.ParseFromString(serialized)
2062 
2063  self.assertEqual(msg, msg2)
2064 
2065  # Now test that various mutations of the map properly invalidate the
2066  # cached size of the submessage.
2067  msg.test_map.map_int32_foreign_message[888].c = 7
2068  serialized = msg.SerializeToString()
2069  msg2.ParseFromString(serialized)
2070  self.assertEqual(msg, msg2)
2071 
2072  msg.test_map.map_int32_foreign_message[888].MergeFrom(
2073  msg.test_map.map_int32_foreign_message[123])
2074  serialized = msg.SerializeToString()
2075  msg2.ParseFromString(serialized)
2076  self.assertEqual(msg, msg2)
2077 
2078  msg.test_map.map_int32_foreign_message.clear()
2079  serialized = msg.SerializeToString()
2080  msg2.ParseFromString(serialized)
2081  self.assertEqual(msg, msg2)
2082 
2084  msg = map_unittest_pb2.TestMap()
2085 
2086  string_string_iter = iter(msg.map_string_string)
2087  int32_foreign_iter = iter(msg.map_int32_foreign_message)
2088 
2089  msg.map_string_string['abc'] = '123'
2090  msg.map_int32_foreign_message[5].c = 5
2091 
2092  with self.assertRaises(RuntimeError):
2093  for key in string_string_iter:
2094  pass
2095 
2096  with self.assertRaises(RuntimeError):
2097  for key in int32_foreign_iter:
2098  pass
2099 
2101  msg = map_unittest_pb2.TestMap()
2102 
2103  submsg = msg.map_int32_foreign_message[111]
2104  self.assertIs(submsg, msg.map_int32_foreign_message[111])
2105  self.assertIsInstance(submsg, unittest_pb2.ForeignMessage)
2106 
2107  submsg.c = 5
2108 
2109  serialized = msg.SerializeToString()
2110  msg2 = map_unittest_pb2.TestMap()
2111  msg2.ParseFromString(serialized)
2112 
2113  self.assertEqual(5, msg2.map_int32_foreign_message[111].c)
2114 
2115  # Doesn't allow direct submessage assignment.
2116  with self.assertRaises(ValueError):
2117  msg.map_int32_foreign_message[88] = unittest_pb2.ForeignMessage()
2118 
2119  def testMapIteration(self):
2120  msg = map_unittest_pb2.TestMap()
2121 
2122  for k, v in msg.map_int32_int32.items():
2123  # Should not be reached.
2124  self.assertTrue(False)
2125 
2126  msg.map_int32_int32[2] = 4
2127  msg.map_int32_int32[3] = 6
2128  msg.map_int32_int32[4] = 8
2129  self.assertEqual(3, len(msg.map_int32_int32))
2130 
2131  matching_dict = {2: 4, 3: 6, 4: 8}
2132  self.assertMapIterEquals(msg.map_int32_int32.items(), matching_dict)
2133 
2134  def testPython2Map(self):
2135  if sys.version_info < (3,):
2136  msg = map_unittest_pb2.TestMap()
2137  msg.map_int32_int32[2] = 4
2138  msg.map_int32_int32[3] = 6
2139  msg.map_int32_int32[4] = 8
2140  msg.map_int32_int32[5] = 10
2141  map_int32 = msg.map_int32_int32
2142  self.assertEqual(4, len(map_int32))
2143  msg2 = map_unittest_pb2.TestMap()
2144  msg2.ParseFromString(msg.SerializeToString())
2145 
2146  def CheckItems(seq, iterator):
2147  self.assertEqual(next(iterator), seq[0])
2148  self.assertEqual(list(iterator), seq[1:])
2149 
2150  CheckItems(map_int32.items(), map_int32.iteritems())
2151  CheckItems(map_int32.keys(), map_int32.iterkeys())
2152  CheckItems(map_int32.values(), map_int32.itervalues())
2153 
2154  self.assertEqual(6, map_int32.get(3))
2155  self.assertEqual(None, map_int32.get(999))
2156  self.assertEqual(6, map_int32.pop(3))
2157  self.assertEqual(0, map_int32.pop(3))
2158  self.assertEqual(3, len(map_int32))
2159  key, value = map_int32.popitem()
2160  self.assertEqual(2 * key, value)
2161  self.assertEqual(2, len(map_int32))
2162  map_int32.clear()
2163  self.assertEqual(0, len(map_int32))
2164 
2165  with self.assertRaises(KeyError):
2166  map_int32.popitem()
2167 
2168  self.assertEqual(0, map_int32.setdefault(2))
2169  self.assertEqual(1, len(map_int32))
2170 
2171  map_int32.update(msg2.map_int32_int32)
2172  self.assertEqual(4, len(map_int32))
2173 
2174  with self.assertRaises(TypeError):
2175  map_int32.update(msg2.map_int32_int32,
2176  msg2.map_int32_int32)
2177  with self.assertRaises(TypeError):
2178  map_int32.update(0)
2179  with self.assertRaises(TypeError):
2180  map_int32.update(value=12)
2181 
2182  def testMapItems(self):
2183  # Map items used to have strange behaviors when use c extension. Because
2184  # [] may reorder the map and invalidate any exsting iterators.
2185  # TODO(jieluo): Check if [] reordering the map is a bug or intended
2186  # behavior.
2187  msg = map_unittest_pb2.TestMap()
2188  msg.map_string_string['local_init_op'] = ''
2189  msg.map_string_string['trainable_variables'] = ''
2190  msg.map_string_string['variables'] = ''
2191  msg.map_string_string['init_op'] = ''
2192  msg.map_string_string['summaries'] = ''
2193  items1 = msg.map_string_string.items()
2194  items2 = msg.map_string_string.items()
2195  self.assertEqual(items1, items2)
2196 
2198  golden_data = (b'r\x0c\n\x07init_op\x12\x01d'
2199  b'r\n\n\x05item1\x12\x01e'
2200  b'r\n\n\x05item2\x12\x01f'
2201  b'r\n\n\x05item3\x12\x01g'
2202  b'r\x0b\n\x05item4\x12\x02QQ'
2203  b'r\x12\n\rlocal_init_op\x12\x01a'
2204  b'r\x0e\n\tsummaries\x12\x01e'
2205  b'r\x18\n\x13trainable_variables\x12\x01b'
2206  b'r\x0e\n\tvariables\x12\x01c')
2207  msg = map_unittest_pb2.TestMap()
2208  msg.map_string_string['local_init_op'] = 'a'
2209  msg.map_string_string['trainable_variables'] = 'b'
2210  msg.map_string_string['variables'] = 'c'
2211  msg.map_string_string['init_op'] = 'd'
2212  msg.map_string_string['summaries'] = 'e'
2213  msg.map_string_string['item1'] = 'e'
2214  msg.map_string_string['item2'] = 'f'
2215  msg.map_string_string['item3'] = 'g'
2216  msg.map_string_string['item4'] = 'QQ'
2217 
2218  # If deterministic serialization is not working correctly, this will be
2219  # "flaky" depending on the exact python dict hash seed.
2220  #
2221  # Fortunately, there are enough items in this map that it is extremely
2222  # unlikely to ever hit the "right" in-order combination, so the test
2223  # itself should fail reliably.
2224  self.assertEqual(golden_data, msg.SerializeToString(deterministic=True))
2225 
2227  # Iterator needs to work even if message and map are deleted.
2228  msg = map_unittest_pb2.TestMap()
2229 
2230  msg.map_int32_int32[2] = 4
2231  msg.map_int32_int32[3] = 6
2232  msg.map_int32_int32[4] = 8
2233 
2234  it = msg.map_int32_int32.items()
2235  del msg
2236 
2237  matching_dict = {2: 4, 3: 6, 4: 8}
2238  self.assertMapIterEquals(it, matching_dict)
2239 
2241  msg = map_unittest_pb2.TestMap(map_int32_int32={1: 2, 3: 4})
2242  self.assertEqual(2, msg.map_int32_int32[1])
2243  self.assertEqual(4, msg.map_int32_int32[3])
2244 
2245  msg = map_unittest_pb2.TestMap(
2246  map_int32_foreign_message={3: unittest_pb2.ForeignMessage(c=5)})
2247  self.assertEqual(5, msg.map_int32_foreign_message[3].c)
2248 
2250  msg1 = map_unittest_pb2.TestMap()
2251  msg1.map_int32_int32[1] = 42
2252  msg2 = map_unittest_pb2.TestMap(map_int32_int32=msg1.map_int32_int32)
2253  self.assertEqual(42, msg2.map_int32_int32[1])
2254 
2256  msg1 = map_unittest_pb2.TestMap()
2257  msg1.map_string_foreign_message['test'].c = 42
2258  msg2 = map_unittest_pb2.TestMap(
2259  map_string_foreign_message=msg1.map_string_foreign_message)
2260  self.assertEqual(42, msg2.map_string_foreign_message['test'].c)
2261 
2263  # Should raise a TypeError when given a non-iterable.
2264  with self.assertRaises(TypeError):
2265  map_unittest_pb2.TestMap(map_string_foreign_message=1)
2266 
2268  # Map needs to work even if field is cleared.
2269  # For the C++ implementation this tests the correctness of
2270  # MapContainer::Release()
2271  msg = map_unittest_pb2.TestMap()
2272  int32_map = msg.map_int32_int32
2273 
2274  int32_map[2] = 4
2275  int32_map[3] = 6
2276  int32_map[4] = 8
2277 
2278  msg.ClearField('map_int32_int32')
2279  self.assertEqual(b'', msg.SerializeToString())
2280  matching_dict = {2: 4, 3: 6, 4: 8}
2281  self.assertMapIterEquals(int32_map.items(), matching_dict)
2282 
2284  # Map needs to work even if field is cleared.
2285  # For the C++ implementation this tests the correctness of
2286  # MapContainer::Release()
2287  msg = map_unittest_pb2.TestMap()
2288  int32_foreign_message = msg.map_int32_foreign_message
2289 
2290  int32_foreign_message[2].c = 5
2291 
2292  msg.ClearField('map_int32_foreign_message')
2293  self.assertEqual(b'', msg.SerializeToString())
2294  self.assertTrue(2 in int32_foreign_message.keys())
2295 
2297  # Message map item needs to work even if it is cleared.
2298  # For the C++ implementation this tests the correctness of
2299  # MapContainer::Release()
2300  msg = map_unittest_pb2.TestMap()
2301  msg.map_int32_all_types[2].optional_string = 'bar'
2302 
2303  if api_implementation.Type() == 'cpp':
2304  # Need to keep the map reference because of b/27942626.
2305  # TODO(jieluo): Remove it.
2306  unused_map = msg.map_int32_all_types # pylint: disable=unused-variable
2307  msg_value = msg.map_int32_all_types[2]
2308  msg.Clear()
2309 
2310  # Reset to trigger sync between repeated field and map in c++.
2311  msg.map_int32_all_types[3].optional_string = 'foo'
2312  self.assertEqual(msg_value.optional_string, 'bar')
2313 
2315  # Map iterator is invalidated when field is cleared.
2316  # But this case does need to not crash the interpreter.
2317  # For the C++ implementation this tests the correctness of
2318  # ScalarMapContainer::Release()
2319  msg = map_unittest_pb2.TestMap()
2320 
2321  it = iter(msg.map_int32_int32)
2322 
2323  msg.ClearField('map_int32_int32')
2324  with self.assertRaises(RuntimeError):
2325  for _ in it:
2326  pass
2327 
2328  it = iter(msg.map_int32_foreign_message)
2329  msg.ClearField('map_int32_foreign_message')
2330  with self.assertRaises(RuntimeError):
2331  for _ in it:
2332  pass
2333 
2334  def testMapDelete(self):
2335  msg = map_unittest_pb2.TestMap()
2336 
2337  self.assertEqual(0, len(msg.map_int32_int32))
2338 
2339  msg.map_int32_int32[4] = 6
2340  self.assertEqual(1, len(msg.map_int32_int32))
2341 
2342  with self.assertRaises(KeyError):
2343  del msg.map_int32_int32[88]
2344 
2345  del msg.map_int32_int32[4]
2346  self.assertEqual(0, len(msg.map_int32_int32))
2347 
2348  with self.assertRaises(KeyError):
2349  del msg.map_int32_all_types[32]
2350 
2352  msg = map_unittest_pb2.TestMap()
2353  self.assertIsInstance(msg.map_int32_int32, collections_abc.Mapping)
2354  self.assertIsInstance(msg.map_int32_int32, collections_abc.MutableMapping)
2355  self.assertIsInstance(msg.map_int32_foreign_message, collections_abc.Mapping)
2356  self.assertIsInstance(msg.map_int32_foreign_message,
2357  collections_abc.MutableMapping)
2358 
2359  def testMapsCompare(self):
2360  msg = map_unittest_pb2.TestMap()
2361  msg.map_int32_int32[-123] = -456
2362  self.assertEqual(msg.map_int32_int32, msg.map_int32_int32)
2363  self.assertEqual(msg.map_int32_foreign_message,
2364  msg.map_int32_foreign_message)
2365  self.assertNotEqual(msg.map_int32_int32, 0)
2366 
2368  msg = map_unittest_pb2.TestMap()
2369  msg.map_string_string['abc'] = '123'
2370  msg.map_int32_int32[35] = 64
2371  msg.map_string_foreign_message['foo'].c = 5
2372  self.assertEqual(0, len(msg.FindInitializationErrors()))
2373 
2374  @unittest.skipIf(sys.maxunicode == UCS2_MAXUNICODE, 'Skip for ucs2')
2376  # Test u'\ud801' is rejected at parser in both python2 and python3.
2377  serialized = (b'r\x03\xed\xa0\x81')
2378  msg = unittest_proto3_arena_pb2.TestAllTypes()
2379  with self.assertRaises(Exception) as context:
2380  msg.MergeFromString(serialized)
2381  if api_implementation.Type() == 'python':
2382  self.assertIn('optional_string', str(context.exception))
2383  else:
2384  self.assertIn('Error parsing message', str(context.exception))
2385 
2386  # Test optional_string=u'😍' is accepted.
2387  serialized = unittest_proto3_arena_pb2.TestAllTypes(
2388  optional_string=u'😍').SerializeToString()
2389  msg2 = unittest_proto3_arena_pb2.TestAllTypes()
2390  msg2.MergeFromString(serialized)
2391  self.assertEqual(msg2.optional_string, u'😍')
2392 
2393  msg = unittest_proto3_arena_pb2.TestAllTypes(
2394  optional_string=u'\ud001')
2395  self.assertEqual(msg.optional_string, u'\ud001')
2396 
2397  @unittest.skipIf(six.PY2, 'Surrogates are acceptable in python2')
2399  # Surrogates like U+D83D is an invalid unicode character, it is
2400  # supported by Python2 only because in some builds, unicode strings
2401  # use 2-bytes code units. Since Python 3.3, we don't have this problem.
2402  #
2403  # Surrogates are utf16 code units, in a unicode string they are invalid
2404  # characters even when they appear in pairs like u'\ud801\udc01'. Protobuf
2405  # Python3 reject such cases at setters and parsers. Python2 accpect it
2406  # to keep same features with the language itself. 'Unpaired pairs'
2407  # like u'\ud801' are rejected at parsers when strict utf8 check is enabled
2408  # in proto3 to keep same behavior with c extension.
2409 
2410  # Surrogates are rejected at setters in Python3.
2411  with self.assertRaises(ValueError):
2412  unittest_proto3_arena_pb2.TestAllTypes(
2413  optional_string=u'\ud801\udc01')
2414  with self.assertRaises(ValueError):
2415  unittest_proto3_arena_pb2.TestAllTypes(
2416  optional_string=b'\xed\xa0\x81')
2417  with self.assertRaises(ValueError):
2418  unittest_proto3_arena_pb2.TestAllTypes(
2419  optional_string=u'\ud801')
2420  with self.assertRaises(ValueError):
2421  unittest_proto3_arena_pb2.TestAllTypes(
2422  optional_string=u'\ud801\ud801')
2423 
2424  @unittest.skipIf(six.PY3 or sys.maxunicode == UCS2_MAXUNICODE,
2425  'Surrogates are rejected at setters in Python3')
2427  # Test optional_string=u'\ud801\udc01'.
2428  # surrogate pair is acceptable in python2.
2429  msg = unittest_proto3_arena_pb2.TestAllTypes(
2430  optional_string=u'\ud801\udc01')
2431  # TODO(jieluo): Change pure python to have same behavior with c extension.
2432  # Some build in python2 consider u'\ud801\udc01' and u'\U00010401' are
2433  # equal, some are not equal.
2434  if api_implementation.Type() == 'python':
2435  self.assertEqual(msg.optional_string, u'\ud801\udc01')
2436  else:
2437  self.assertEqual(msg.optional_string, u'\U00010401')
2438  serialized = msg.SerializeToString()
2439  msg2 = unittest_proto3_arena_pb2.TestAllTypes()
2440  msg2.MergeFromString(serialized)
2441  self.assertEqual(msg2.optional_string, u'\U00010401')
2442 
2443  # Python2 does not reject surrogates at setters.
2444  msg = unittest_proto3_arena_pb2.TestAllTypes(
2445  optional_string=b'\xed\xa0\x81')
2446  unittest_proto3_arena_pb2.TestAllTypes(
2447  optional_string=u'\ud801')
2448  unittest_proto3_arena_pb2.TestAllTypes(
2449  optional_string=u'\ud801\ud801')
2450 
2451 
2452 @testing_refleaks.TestCase
2453 class ValidTypeNamesTest(unittest.TestCase):
2454 
2455  def assertImportFromName(self, msg, base_name):
2456  # Parse <type 'module.class_name'> to extra 'some.name' as a string.
2457  tp_name = str(type(msg)).split("'")[1]
2458  valid_names = ('Repeated%sContainer' % base_name,
2459  'Repeated%sFieldContainer' % base_name)
2460  self.assertTrue(any(tp_name.endswith(v) for v in valid_names),
2461  '%r does end with any of %r' % (tp_name, valid_names))
2462 
2463  parts = tp_name.split('.')
2464  class_name = parts[-1]
2465  module_name = '.'.join(parts[:-1])
2466  __import__(module_name, fromlist=[class_name])
2467 
2469  # If import doesn't work, pickling won't work either.
2470  pb = unittest_pb2.TestAllTypes()
2471  self.assertImportFromName(pb.repeated_int32, 'Scalar')
2472  self.assertImportFromName(pb.repeated_nested_message, 'Composite')
2473 
2474 @testing_refleaks.TestCase
2475 class PackedFieldTest(unittest.TestCase):
2476 
2477  def setMessage(self, message):
2478  message.repeated_int32.append(1)
2479  message.repeated_int64.append(1)
2480  message.repeated_uint32.append(1)
2481  message.repeated_uint64.append(1)
2482  message.repeated_sint32.append(1)
2483  message.repeated_sint64.append(1)
2484  message.repeated_fixed32.append(1)
2485  message.repeated_fixed64.append(1)
2486  message.repeated_sfixed32.append(1)
2487  message.repeated_sfixed64.append(1)
2488  message.repeated_float.append(1.0)
2489  message.repeated_double.append(1.0)
2490  message.repeated_bool.append(True)
2491  message.repeated_nested_enum.append(1)
2492 
2493  def testPackedFields(self):
2494  message = packed_field_test_pb2.TestPackedTypes()
2495  self.setMessage(message)
2496  golden_data = (b'\x0A\x01\x01'
2497  b'\x12\x01\x01'
2498  b'\x1A\x01\x01'
2499  b'\x22\x01\x01'
2500  b'\x2A\x01\x02'
2501  b'\x32\x01\x02'
2502  b'\x3A\x04\x01\x00\x00\x00'
2503  b'\x42\x08\x01\x00\x00\x00\x00\x00\x00\x00'
2504  b'\x4A\x04\x01\x00\x00\x00'
2505  b'\x52\x08\x01\x00\x00\x00\x00\x00\x00\x00'
2506  b'\x5A\x04\x00\x00\x80\x3f'
2507  b'\x62\x08\x00\x00\x00\x00\x00\x00\xf0\x3f'
2508  b'\x6A\x01\x01'
2509  b'\x72\x01\x01')
2510  self.assertEqual(golden_data, message.SerializeToString())
2511 
2513  message = packed_field_test_pb2.TestUnpackedTypes()
2514  self.setMessage(message)
2515  golden_data = (b'\x08\x01'
2516  b'\x10\x01'
2517  b'\x18\x01'
2518  b'\x20\x01'
2519  b'\x28\x02'
2520  b'\x30\x02'
2521  b'\x3D\x01\x00\x00\x00'
2522  b'\x41\x01\x00\x00\x00\x00\x00\x00\x00'
2523  b'\x4D\x01\x00\x00\x00'
2524  b'\x51\x01\x00\x00\x00\x00\x00\x00\x00'
2525  b'\x5D\x00\x00\x80\x3f'
2526  b'\x61\x00\x00\x00\x00\x00\x00\xf0\x3f'
2527  b'\x68\x01'
2528  b'\x70\x01')
2529  self.assertEqual(golden_data, message.SerializeToString())
2530 
2531 
2532 @unittest.skipIf(api_implementation.Type() != 'cpp' or
2533  sys.version_info < (2, 7),
2534  'explicit tests of the C++ implementation for PY27 and above')
2535 @testing_refleaks.TestCase
2536 class OversizeProtosTest(unittest.TestCase):
2537 
2538  @classmethod
2539  def setUpClass(cls):
2540  # At the moment, reference cycles between DescriptorPool and Message classes
2541  # are not detected and these objects are never freed.
2542  # To avoid errors with ReferenceLeakChecker, we create the class only once.
2543  file_desc = """
2544  name: "f/f.msg2"
2545  package: "f"
2546  message_type {
2547  name: "msg1"
2548  field {
2549  name: "payload"
2550  number: 1
2551  label: LABEL_OPTIONAL
2552  type: TYPE_STRING
2553  }
2554  }
2555  message_type {
2556  name: "msg2"
2557  field {
2558  name: "field"
2559  number: 1
2560  label: LABEL_OPTIONAL
2561  type: TYPE_MESSAGE
2562  type_name: "msg1"
2563  }
2564  }
2565  """
2567  desc = descriptor_pb2.FileDescriptorProto()
2568  text_format.Parse(file_desc, desc)
2569  pool.Add(desc)
2570  cls.proto_cls = message_factory.MessageFactory(pool).GetPrototype(
2571  pool.FindMessageTypeByName('f.msg2'))
2572 
2573  def setUp(self):
2574  self.p = self.proto_cls()
2575  self.p.field.payload = 'c' * (1024 * 1024 * 64 + 1)
2577 
2579  from google.protobuf.pyext._message import SetAllowOversizeProtos
2580  SetAllowOversizeProtos(False)
2581  q = self.proto_cls()
2582  try:
2583  q.ParseFromString(self.p_serialized)
2584  except message.DecodeError as e:
2585  self.assertEqual(str(e), 'Error parsing message')
2586 
2588  from google.protobuf.pyext._message import SetAllowOversizeProtos
2590  q = self.proto_cls()
2591  q.ParseFromString(self.p_serialized)
2592  self.assertEqual(self.p.field.payload, q.field.payload)
2593 
2594 if __name__ == '__main__':
2595  unittest.main()
google::protobuf.internal.message_test.IsPosInf
def IsPosInf(val)
Definition: google/protobuf/internal/message_test.py:103
google::protobuf.internal.message_test.MessageTest.testOneofWhichOneof
def testOneofWhichOneof(self, message_module)
Definition: google/protobuf/internal/message_test.py:928
google::protobuf.internal.message_test.MessageTest.testPositiveInfinityPacked
def testPositiveInfinityPacked(self, message_module)
Definition: google/protobuf/internal/message_test.py:276
google::protobuf.internal.message_test.MessageTest.testMergeFromStringUsingMemoryViewIsPy2Error
def testMergeFromStringUsingMemoryViewIsPy2Error(self, message_module)
Definition: google/protobuf/internal/message_test.py:841
google::protobuf::hash
Definition: hash.h:51
google::protobuf.internal.message_test.MessageTest.TestIterable.__init__
def __init__(self, values=None)
Definition: google/protobuf/internal/message_test.py:1146
google::protobuf.internal.message_test.MessageTest.testRepeatedFieldsNotHashable
def testRepeatedFieldsNotHashable(self, message_module)
Definition: google/protobuf/internal/message_test.py:764
google::protobuf.internal.message_test.Proto3Test.testMapGet
def testMapGet(self)
Definition: google/protobuf/internal/message_test.py:1721
google::protobuf.internal.message_test.MessageTest.testRepeatedFieldsComparable
def testRepeatedFieldsComparable(self, message_module)
Definition: google/protobuf/internal/message_test.py:723
google::protobuf.internal.message_test.OversizeProtosTest.proto_cls
proto_cls
Definition: google/protobuf/internal/message_test.py:2570
google::protobuf.internal.message_test.MessageTest
Definition: google/protobuf/internal/message_test.py:113
google::protobuf.internal.message_test.OversizeProtosTest.p
p
Definition: google/protobuf/internal/message_test.py:2574
google::protobuf.internal.message_test.MessageTest.testOneofClearField
def testOneofClearField(self, message_module)
Definition: google/protobuf/internal/message_test.py:947
google::protobuf.internal.message_test.Proto3Test.assertMapIterEquals
def assertMapIterEquals(self, map_iter, dict_value)
Definition: google/protobuf/internal/message_test.py:1582
google::protobuf.internal.message_test.MessageTest.testPositiveInfinity
def testPositiveInfinity(self, message_module)
Definition: google/protobuf/internal/message_test.py:212
getattr
static uint64_t getattr(const tarjan *t, const upb_refcounted *r)
Definition: ruby/ext/google/protobuf_c/upb.c:5868
google::protobuf.internal.message_test.Proto3Test.testSurrogatesInPython2
def testSurrogatesInPython2(self)
Definition: google/protobuf/internal/message_test.py:2426
google::protobuf.internal.message_test.MessageTest.testOneofNestedMessageInit
def testOneofNestedMessageInit(self, message_module)
Definition: google/protobuf/internal/message_test.py:1012
google::protobuf.internal.python_message.MergeFrom
MergeFrom
Definition: python_message.py:1340
google::protobuf.internal.message_test.MessageTest.testGoldenPackedMessage
def testGoldenPackedMessage(self, message_module)
Definition: google/protobuf/internal/message_test.py:143
google::protobuf.internal.message_test.MessageTest.testOneofClearUnsetField
def testOneofClearUnsetField(self, message_module)
Definition: google/protobuf/internal/message_test.py:965
google::protobuf.internal.message_test.Proto3Test.testMessageMapValidAfterFieldCleared
def testMessageMapValidAfterFieldCleared(self)
Definition: google/protobuf/internal/message_test.py:2283
google::protobuf.internal.message_test.Proto3Test.testMapFieldRaisesCorrectError
def testMapFieldRaisesCorrectError(self)
Definition: google/protobuf/internal/message_test.py:2262
google::protobuf.internal.message_test.MessageTest.testOneofNestedMergeFrom
def testOneofNestedMergeFrom(self, message_module)
Definition: google/protobuf/internal/message_test.py:990
google::protobuf.internal.message_test.ValidTypeNamesTest.assertImportFromName
def assertImportFromName(self, msg, base_name)
Definition: google/protobuf/internal/message_test.py:2455
google::protobuf.internal.message_test.Proto3Test
Definition: google/protobuf/internal/message_test.py:1579
google::protobuf.internal.message_test.MessageTest.TestIterable._list
_list
Definition: google/protobuf/internal/message_test.py:1147
google::protobuf.internal.message_test.Proto3Test.testModifyMapWhileIterating
def testModifyMapWhileIterating(self)
Definition: google/protobuf/internal/message_test.py:2083
google::protobuf.internal.message_test.MessageTest.testNotANumberPacked
def testNotANumberPacked(self, message_module)
Definition: google/protobuf/internal/message_test.py:294
google::protobuf.internal.message_test.MessageTest.testInsertRepeatedCompositeField
def testInsertRepeatedCompositeField(self, message_module)
Definition: google/protobuf/internal/message_test.py:453
google::protobuf.internal.message_test.Proto3Test.testMapsCompare
def testMapsCompare(self)
Definition: google/protobuf/internal/message_test.py:2359
google::protobuf.internal.message_test.OversizeProtosTest.testAssertOversizeProto
def testAssertOversizeProto(self)
Definition: google/protobuf/internal/message_test.py:2578
google::protobuf
Definition: data_proto2_to_proto3_util.h:12
google::protobuf.internal.message_test.Proto3Test.testMapConstruction
def testMapConstruction(self)
Definition: google/protobuf/internal/message_test.py:2240
google::protobuf.internal.message_test.MessageTest.testExtendStringWithPythonList
def testExtendStringWithPythonList(self, message_module)
Definition: google/protobuf/internal/message_test.py:1121
google::protobuf.internal.message_test.MessageTest.testUnknownFieldPrinting
def testUnknownFieldPrinting(self, message_module)
Definition: google/protobuf/internal/message_test.py:432
google::protobuf.internal.message_test.MessageTest.testRepeatedScalarIterable
def testRepeatedScalarIterable(self, message_module)
Definition: google/protobuf/internal/message_test.py:538
google::protobuf.internal.message_test.Proto2Test.testPythonicInitWithDict
def testPythonicInitWithDict(self)
Definition: google/protobuf/internal/message_test.py:1556
google::protobuf.internal.message_test.Proto3Test.testMapIterInvalidatedByClearField
def testMapIterInvalidatedByClearField(self)
Definition: google/protobuf/internal/message_test.py:2314
google::protobuf.internal.message_test.MessageTest.testMergeFromStringUsingMemoryViewWorksInPy3
def testMergeFromStringUsingMemoryViewWorksInPy3(self, message_module)
Definition: google/protobuf/internal/message_test.py:818
google::protobuf.internal.message_test.MessageTest.testOneofDefaultValues
def testOneofDefaultValues(self, message_module)
Definition: google/protobuf/internal/message_test.py:869
google::protobuf.internal.message_test.MessageTest.testDeterminismParameters
def testDeterminismParameters(self, message_module)
Definition: google/protobuf/internal/message_test.py:167
google::protobuf.internal.message_test.Proto3Test.testMergeFrom
def testMergeFrom(self)
Definition: google/protobuf/internal/message_test.py:1898
google::protobuf.internal.message_test.MessageTest.testOneofMessageMergeFrom
def testOneofMessageMergeFrom(self, message_module)
Definition: google/protobuf/internal/message_test.py:1000
google::protobuf.internal.message_test.MessageTest.testOneofClearSetField
def testOneofClearSetField(self, message_module)
Definition: google/protobuf/internal/message_test.py:956
google::protobuf.internal.message_test.Proto3Test.testMessageMap
def testMessageMap(self)
Definition: google/protobuf/internal/message_test.py:1829
google::protobuf.internal.message_test.Proto3Test.testMapDeterministicSerialization
def testMapDeterministicSerialization(self)
Definition: google/protobuf/internal/message_test.py:2197
google::protobuf.internal.message_test.PackedFieldTest
Definition: google/protobuf/internal/message_test.py:2475
google::protobuf.internal.message_test.MessageTest.testRepeatedCompareWithSelf
def testRepeatedCompareWithSelf(self, message_module)
Definition: google/protobuf/internal/message_test.py:1253
google::protobuf.internal.message_test.MessageTest.testOneofDeserialize
def testOneofDeserialize(self, message_module)
Definition: google/protobuf/internal/message_test.py:976
google::protobuf.internal.message_test.Proto3Test.testMapIteration
def testMapIteration(self)
Definition: google/protobuf/internal/message_test.py:2119
google::protobuf.internal.message_test.MessageTest.testGoldenMessage
def testGoldenMessage(self, message_module)
Definition: google/protobuf/internal/message_test.py:125
google::protobuf.internal.message_test.MessageTest.testRepeatedFieldInsideNestedMessage
def testRepeatedFieldInsideNestedMessage(self, message_module)
Definition: google/protobuf/internal/message_test.py:771
google::protobuf.internal.message_test.MessageTest.testReleasedNestedMessages
def testReleasedNestedMessages(self, message_module)
Definition: google/protobuf/internal/message_test.py:1262
google::protobuf.internal.message_test.MessageTest.testSortingRepeatedScalarFieldsCustomComparator
def testSortingRepeatedScalarFieldsCustomComparator(self, message_module)
Definition: google/protobuf/internal/message_test.py:600
google::protobuf.internal.message_test.isinf
def isinf(val)
Definition: google/protobuf/internal/message_test.py:100
google::protobuf.internal.message_test.MessageTest.testPickleSupport
def testPickleSupport(self, message_module)
Definition: google/protobuf/internal/message_test.py:203
google::protobuf.internal.message_test.MessageTest.testAssignByteStringToUnicodeField
def testAssignByteStringToUnicodeField(self, message_module)
Definition: google/protobuf/internal/message_test.py:1025
google::protobuf.internal.message_test.MessageTest.testExtendShouldNotSwallowExceptions
def testExtendShouldNotSwallowExceptions(self, message_module)
Definition: google/protobuf/internal/message_test.py:1049
google::protobuf.internal.message_test.MessageTest.testParseErrors
def testParseErrors(self, message_module)
Definition: google/protobuf/internal/message_test.py:155
google::protobuf.internal.message_test.MessageTest.testExtendFloatWithIterable
def testExtendFloatWithIterable(self, message_module)
Definition: google/protobuf/internal/message_test.py:1176
google::protobuf.internal.message_test.MessageTest.testOneofSemantics
def testOneofSemantics(self, message_module)
Definition: google/protobuf/internal/message_test.py:885
google::protobuf.internal.message_test.PackedFieldTest.testPackedFields
def testPackedFields(self)
Definition: google/protobuf/internal/message_test.py:2493
google::protobuf.internal.message_test.MessageTest.TestIterable.__nonzero__
def __nonzero__(self)
Definition: google/protobuf/internal/message_test.py:1149
google::protobuf.internal.message_test.Proto2Test.testParsingMerge
def testParsingMerge(self)
Definition: google/protobuf/internal/message_test.py:1446
google::protobuf.internal
Definition: python/google/protobuf/internal/__init__.py:1
google::protobuf.internal.message_test.MessageTest.testOneofGetCaseNonexistingField
def testOneofGetCaseNonexistingField(self, message_module)
Definition: google/protobuf/internal/message_test.py:864
google::protobuf.internal.message_test.MessageTest.testNotANumber
def testNotANumber(self, message_module)
Definition: google/protobuf/internal/message_test.py:252
google::protobuf.internal.message_test.MessageTest.testExtendInt32WithIterable
def testExtendInt32WithIterable(self, message_module)
Definition: google/protobuf/internal/message_test.py:1163
google::protobuf.internal.message_test.Proto2Test.testFieldPresence
def testFieldPresence(self)
Definition: google/protobuf/internal/message_test.py:1306
google::protobuf.internal.message_test.Proto3Test.testMapItems
def testMapItems(self)
Definition: google/protobuf/internal/message_test.py:2182
google::protobuf.internal.message_test.MessageTest.testMergeFromEmpty
def testMergeFromEmpty(self, message_module)
Definition: google/protobuf/internal/message_test.py:846
google::protobuf.internal.message_test.Proto3Test.testMergeFromBadType
def testMergeFromBadType(self)
Definition: google/protobuf/internal/message_test.py:2001
google::protobuf.internal.message_test.MessageTest.testHighPrecisionFloatPrinting
def testHighPrecisionFloatPrinting(self, message_module)
Definition: google/protobuf/internal/message_test.py:424
google::protobuf.internal.message_test.Proto2Test.testAssignInvalidEnum
def testAssignInvalidEnum(self)
Definition: google/protobuf/internal/message_test.py:1354
google::protobuf.internal.message_test.MessageTest.testLongValuedSlice
def testLongValuedSlice(self, message_module)
Definition: google/protobuf/internal/message_test.py:1032
google::protobuf.internal.message_test.ValidTypeNamesTest.testTypeNamesCanBeImported
def testTypeNamesCanBeImported(self)
Definition: google/protobuf/internal/message_test.py:2468
google::protobuf.internal.message_test.MessageTest.TestIterable.__len__
def __len__(self)
Definition: google/protobuf/internal/message_test.py:1157
google::protobuf.internal.message_test.Proto3Test.testStrictUtf8Check
def testStrictUtf8Check(self)
Definition: google/protobuf/internal/message_test.py:2375
google::protobuf.internal.message_test.Proto3Test.testFieldPresence
def testFieldPresence(self)
Definition: google/protobuf/internal/message_test.py:1592
google::protobuf.internal.message_test.Proto3Test.testIntegerMapWithLongs
def testIntegerMapWithLongs(self)
Definition: google/protobuf/internal/message_test.py:2017
update_failure_list.str
str
Definition: update_failure_list.py:41
google::protobuf.internal.message_test.PackedFieldTest.setMessage
def setMessage(self, message)
Definition: google/protobuf/internal/message_test.py:2477
google::protobuf.internal.message_test.Proto2Test.testUnknownEnumMap
def testUnknownEnumMap(self)
Definition: google/protobuf/internal/message_test.py:1385
google::protobuf.internal.message_test.MessageTest.testSortingRepeatedCompositeFieldsStable
def testSortingRepeatedCompositeFieldsStable(self, message_module)
Definition: google/protobuf/internal/message_test.py:640
google::protobuf.internal.message_test.MessageTest.testPickleRepeatedScalarContainer
def testPickleRepeatedScalarContainer(self, message_module)
Definition: google/protobuf/internal/message_test.py:1202
google::protobuf.internal.message_test.OversizeProtosTest.p_serialized
p_serialized
Definition: google/protobuf/internal/message_test.py:2576
google::protobuf.internal.message_test.Proto3Test.testMapAssignmentCausesPresence
def testMapAssignmentCausesPresence(self)
Definition: google/protobuf/internal/message_test.py:2033
google::protobuf.internal.message_test.MessageTest.testSortEmptyRepeatedCompositeContainer
def testSortEmptyRepeatedCompositeContainer(self, message_module)
Definition: google/protobuf/internal/message_test.py:1216
google::protobuf.internal.message_test.Proto3Test.testSubmessageMap
def testSubmessageMap(self)
Definition: google/protobuf/internal/message_test.py:2100
google::protobuf.internal.message_test.Proto3Test.testScalarMapDefaults
def testScalarMapDefaults(self)
Definition: google/protobuf/internal/message_test.py:1673
google::protobuf.internal.message_test.OversizeProtosTest.setUp
def setUp(self)
Definition: google/protobuf/internal/message_test.py:2573
google::protobuf.internal.message_test.MessageTest.testNegativeInfinity
def testNegativeInfinity(self, message_module)
Definition: google/protobuf/internal/message_test.py:232
google::protobuf.internal.message_test.Proto3Test.testMapMessageFieldConstruction
def testMapMessageFieldConstruction(self)
Definition: google/protobuf/internal/message_test.py:2255
google::protobuf.internal.message_test.ValidTypeNamesTest
Definition: google/protobuf/internal/message_test.py:2453
google::protobuf::python::cmessage::SetAllowOversizeProtos
PyObject * SetAllowOversizeProtos(PyObject *m, PyObject *arg)
Definition: python/google/protobuf/pyext/message.cc:1913
google::protobuf.internal.message_test.Proto3Test.testCopyFromBadType
def testCopyFromBadType(self)
Definition: google/protobuf/internal/message_test.py:2009
google::protobuf.internal.message_test.MessageTest.testRepeatedScalarFieldPop
def testRepeatedScalarFieldPop(self, message_module)
Definition: google/protobuf/internal/message_test.py:1229
google::protobuf.internal.message_test.Proto3Test.testNestedMessageMapItemDelete
def testNestedMessageMapItemDelete(self)
Definition: google/protobuf/internal/message_test.py:1869
google::protobuf.internal.message_test.Proto3Test.testMapsAreMapping
def testMapsAreMapping(self)
Definition: google/protobuf/internal/message_test.py:2351
google::protobuf.internal.message_test.OversizeProtosTest
Definition: google/protobuf/internal/message_test.py:2536
google::protobuf.internal.message_test.Proto3Test.testStringUnicodeConversionInMap
def testStringUnicodeConversionInMap(self)
Definition: google/protobuf/internal/message_test.py:1813
google::protobuf.internal.message_test.MessageTest.TestIterable.__iter__
def __iter__(self)
Definition: google/protobuf/internal/message_test.py:1160
google::protobuf.internal.message_test.MessageTest.testRepeatedContains
def testRepeatedContains(self, message_module)
Definition: google/protobuf/internal/message_test.py:522
google::protobuf.internal.message_test.MessageTest.testAppendRepeatedCompositeField
def testAppendRepeatedCompositeField(self, message_module)
Definition: google/protobuf/internal/message_test.py:439
google::protobuf.internal.message_test.MessageTest.testNegativeInfinityPacked
def testNegativeInfinityPacked(self, message_module)
Definition: google/protobuf/internal/message_test.py:285
google::protobuf.internal.message_test.Proto2Test.test_documentation
def test_documentation(self)
Definition: google/protobuf/internal/message_test.py:1567
google::protobuf.internal.message_test.Proto3Test.testMapMergeFrom
def testMapMergeFrom(self)
Definition: google/protobuf/internal/message_test.py:1961
google::protobuf.internal.message_test.Proto3Test.testMessageMapItemValidAfterTopMessageCleared
def testMessageMapItemValidAfterTopMessageCleared(self)
Definition: google/protobuf/internal/message_test.py:2296
google::protobuf.internal.message_test.MessageTest.testSetRepeatedComposite
def testSetRepeatedComposite(self, message_module)
Definition: google/protobuf/internal/message_test.py:1272
google::protobuf.internal.message_test.MessageTest.testReturningType
def testReturningType(self, message_module)
Definition: google/protobuf/internal/message_test.py:1280
google::protobuf.internal.message_test.Proto3Test.testMapScalarFieldConstruction
def testMapScalarFieldConstruction(self)
Definition: google/protobuf/internal/message_test.py:2249
len
int len
Definition: php/ext/google/protobuf/map.c:206
google::protobuf.internal.message_test.MessageTest.testSortingRepeatedScalarFieldsDefaultComparator
def testSortingRepeatedScalarFieldsDefaultComparator(self, message_module)
Definition: google/protobuf/internal/message_test.py:560
google::protobuf.internal.message_test.Proto2Test.testGoldenExtensions
def testGoldenExtensions(self)
Definition: google/protobuf/internal/message_test.py:1410
google::protobuf.internal.message_test.MessageTest.testExtendInt32WithNothing
def testExtendInt32WithNothing(self, message_module)
Definition: google/protobuf/internal/message_test.py:1060
google::protobuf.internal.message_test.MessageTest.testMergeFrom
def testMergeFrom(self, message_module)
Definition: google/protobuf/internal/message_test.py:776
google::protobuf.internal.message_test.MessageTest.testExtendFloatWithPythonList
def testExtendFloatWithPythonList(self, message_module)
Definition: google/protobuf/internal/message_test.py:1110
google::protobuf.internal.message_test.isnan
def isnan(val)
Definition: google/protobuf/internal/message_test.py:97
google::protobuf.internal.message_test.MessageTest.testExtendStringWithNothing
def testExtendStringWithNothing(self, message_module)
Definition: google/protobuf/internal/message_test.py:1086
google::protobuf.internal.message_test.Proto2Test.testPythonicInit
def testPythonicInit(self)
Definition: google/protobuf/internal/message_test.py:1495
google::protobuf.internal.message_test.MessageTest.testBadUtf8String
def testBadUtf8String(self, message_module)
Definition: google/protobuf/internal/message_test.py:115
google::protobuf.internal.message_test.Proto3Test.testPython2Map
def testPython2Map(self)
Definition: google/protobuf/internal/message_test.py:2134
google::protobuf.descriptor_pool.DescriptorPool
Definition: descriptor_pool.py:102
google::protobuf.internal.message_test.Proto2Test.testGoldenPackedExtensions
def testGoldenPackedExtensions(self)
Definition: google/protobuf/internal/message_test.py:1421
google::protobuf.internal.message_test.Proto3Test.testAssignUnknownEnum
def testAssignUnknownEnum(self)
Definition: google/protobuf/internal/message_test.py:1649
google::protobuf.internal.message_test.MessageTest.testAddWrongRepeatedNestedField
def testAddWrongRepeatedNestedField(self, message_module)
Definition: google/protobuf/internal/message_test.py:510
cpp.gmock_class.set
set
Definition: gmock_class.py:44
google::protobuf.internal.message_test.MessageTest.testExtendFloatWithNothing
def testExtendFloatWithNothing(self, message_module)
Definition: google/protobuf/internal/message_test.py:1073
google::protobuf.internal.message_test.MessageTest.testMergeFromString
def testMergeFromString(self, message_module)
Definition: google/protobuf/internal/message_test.py:806
google::protobuf.internal.message_test.Proto3Test.testMapByteSize
def testMapByteSize(self)
Definition: google/protobuf/internal/message_test.py:1886
google::protobuf.internal.message_test.MessageTest.testExtendStringWithIterable
def testExtendStringWithIterable(self, message_module)
Definition: google/protobuf/internal/message_test.py:1189
google::protobuf.internal.message_test.MessageTest.testExtendStringWithString
def testExtendStringWithString(self, message_module)
Definition: google/protobuf/internal/message_test.py:1132
google::protobuf.internal.message_test.MessageTest.testOneofCopyFrom
def testOneofCopyFrom(self, message_module)
Definition: google/protobuf/internal/message_test.py:983
google::protobuf.internal.message_test.MessageTest.testOneofCompositeFieldReadAccess
def testOneofCompositeFieldReadAccess(self, message_module)
Definition: google/protobuf/internal/message_test.py:920
google::protobuf.internal.message_test.OversizeProtosTest.testSucceedOversizeProto
def testSucceedOversizeProto(self)
Definition: google/protobuf/internal/message_test.py:2587
google::protobuf.internal.message_test.OversizeProtosTest.setUpClass
def setUpClass(cls)
Definition: google/protobuf/internal/message_test.py:2539
google::protobuf.internal.message_test.MessageTest.testMergeFromRepeatedField
def testMergeFromRepeatedField(self, message_module)
Definition: google/protobuf/internal/message_test.py:491
google::protobuf.internal.message_test.cmp
cmp
Definition: google/protobuf/internal/message_test.py:71
google::protobuf.internal.message_test.Proto3Test.testMapIterationClearMessage
def testMapIterationClearMessage(self)
Definition: google/protobuf/internal/message_test.py:2226
google::protobuf.internal.message_test.Proto2Test
Definition: google/protobuf/internal/message_test.py:1304
google::protobuf.internal.message_test.IsNegInf
def IsNegInf(val)
Definition: google/protobuf/internal/message_test.py:105
google::protobuf.internal.python_message.SerializeToString
SerializeToString
Definition: python_message.py:1081
google::protobuf.internal.message_test.MessageTest.testExtremeFloatValues
def testExtremeFloatValues(self, message_module)
Definition: google/protobuf/internal/message_test.py:308
google::protobuf.internal.message_test.MessageTest.testExtendInt32WithPythonList
def testExtendInt32WithPythonList(self, message_module)
Definition: google/protobuf/internal/message_test.py:1099
google::protobuf.internal.message_test.MessageTest.testRepeatedCompositeFieldSortArguments
def testRepeatedCompositeFieldSortArguments(self, message_module)
Definition: google/protobuf/internal/message_test.py:665
google::protobuf.internal.message_test.Proto2Test.testExtensionsErrors
def testExtensionsErrors(self)
Definition: google/protobuf/internal/message_test.py:1391
google::protobuf.internal.message_test.MessageTest.testHasFieldOnRepeatedField
def testHasFieldOnRepeatedField(self, message_module)
Definition: google/protobuf/internal/message_test.py:1222
google::protobuf.internal.message_test.Proto2Test.testMergeFromExtensions
def testMergeFromExtensions(self)
Definition: google/protobuf/internal/message_test.py:1395
google::protobuf.internal.message_test.MessageTest.testExtremeDoubleValues
def testExtremeDoubleValues(self, message_module)
Definition: google/protobuf/internal/message_test.py:374
cpp.ast.reversed
def reversed(seq)
Definition: ast.py:52
next
static size_t next(const upb_table *t, size_t i)
Definition: php/ext/google/protobuf/upb.c:4889
google::protobuf.internal.message_test.Proto3Test.testMapEntryAlwaysSerialized
def testMapEntryAlwaysSerialized(self)
Definition: google/protobuf/internal/message_test.py:1805
google::protobuf.internal.message_test.Proto3Test.testMapFindInitializationErrorsSmokeTest
def testMapFindInitializationErrorsSmokeTest(self)
Definition: google/protobuf/internal/message_test.py:2367
google::protobuf.internal.python_message.HasField
HasField
Definition: python_message.py:864
google::protobuf.internal.message_test.Proto3Test.testScalarMap
def testScalarMap(self)
Definition: google/protobuf/internal/message_test.py:1746
google::protobuf.internal.message_test.MessageTest.testRepeatedNestedFieldIteration
def testRepeatedNestedFieldIteration(self, message_module)
Definition: google/protobuf/internal/message_test.py:546
google::protobuf.internal.message_test.Proto2Test.testPickleIncompleteProto
def testPickleIncompleteProto(self)
Definition: google/protobuf/internal/message_test.py:1432
google::protobuf.internal.message_test.Proto3Test.testMapValidAfterFieldCleared
def testMapValidAfterFieldCleared(self)
Definition: google/protobuf/internal/message_test.py:2267
google::protobuf.internal.message_test.MessageTest.testOneofClear
def testOneofClear(self, message_module)
Definition: google/protobuf/internal/message_test.py:1017
google::protobuf.internal.message_test.MessageTest.testSortingRepeatedCompositeFieldsCustomComparator
def testSortingRepeatedCompositeFieldsCustomComparator(self, message_module)
Definition: google/protobuf/internal/message_test.py:620
google::protobuf.internal.message_test.MessageTest.testFloatPrinting
def testFloatPrinting(self, message_module)
Definition: google/protobuf/internal/message_test.py:419
google::protobuf.internal.message_test.long
long
Definition: google/protobuf/internal/message_test.py:92
google::protobuf.internal.message_test.MessageTest.testRepeatedScalarFieldSortArguments
def testRepeatedScalarFieldSortArguments(self, message_module)
Definition: google/protobuf/internal/message_test.py:691
google::protobuf.internal.message_test.MessageTest.ensureNestedMessageExists
def ensureNestedMessageExists(self, msg, attribute)
Definition: google/protobuf/internal/message_test.py:855
google::protobuf.message_factory.MessageFactory
Definition: message_factory.py:56
google::protobuf.internal.message_test.Proto3Test.testSurrogatesInPython3
def testSurrogatesInPython3(self)
Definition: google/protobuf/internal/message_test.py:2398
google::protobuf.internal.message_test.MessageTest.testRepeatedCompositeFieldPop
def testRepeatedCompositeFieldPop(self, message_module)
Definition: google/protobuf/internal/message_test.py:1239
google::protobuf.internal.message_test.MessageTest.TestIterable
Definition: google/protobuf/internal/message_test.py:1139
google::protobuf.internal.message_test.Proto3Test.testMapDelete
def testMapDelete(self)
Definition: google/protobuf/internal/message_test.py:2334
google::protobuf.internal.message_test.PackedFieldTest.testUnpackedFields
def testUnpackedFields(self)
Definition: google/protobuf/internal/message_test.py:2512
google::protobuf.internal.message_test.Proto3Test.testMapAssignmentCausesPresenceForSubmessages
def testMapAssignmentCausesPresenceForSubmessages(self)
Definition: google/protobuf/internal/message_test.py:2055
google::protobuf.internal.message_test.MessageTest.testRepeatedFieldsAreSequences
def testRepeatedFieldsAreSequences(self, message_module)
Definition: google/protobuf/internal/message_test.py:758


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:56