blob: 34e74bb3f31b5e7b9fbe9bdfa002c120c7e9a3c7 [file] [log] [blame]
Tamir Duberstein9d9d0b72015-04-11 20:23:45 -07001#! /usr/bin/env python
kenton@google.com80b1d622009-07-29 01:13:20 +00002#
3# Protocol Buffers - Google's data interchange format
4# Copyright 2008 Google Inc. All rights reserved.
Feng Xiaoe4288622014-10-01 16:26:23 -07005# https://developers.google.com/protocol-buffers/
kenton@google.com80b1d622009-07-29 01:13:20 +00006#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions are
9# met:
10#
11# * Redistributions of source code must retain the above copyright
12# notice, this list of conditions and the following disclaimer.
13# * Redistributions in binary form must reproduce the above
14# copyright notice, this list of conditions and the following disclaimer
15# in the documentation and/or other materials provided with the
16# distribution.
17# * Neither the name of Google Inc. nor the names of its
18# contributors may be used to endorse or promote products derived from
19# this software without specific prior written permission.
20#
21# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
kenton@google.comfccb1462009-12-18 02:11:36 +000033"""Tests python protocol buffers against the golden message.
34
35Note that the golden messages exercise every known field type, thus this
36test ends up exercising and verifying nearly all of the parsing and
37serialization code in the whole library.
38
39TODO(kenton): Merge with wire_format_test? It doesn't make a whole lot of
40sense to call this a test of the "message" module, which only declares an
41abstract interface.
42"""
kenton@google.com80b1d622009-07-29 01:13:20 +000043
44__author__ = 'gps@google.com (Gregory P. Smith)'
45
Jisi Liu46e8ff62015-10-05 11:59:43 -070046
Feng Xiaoeee38b02015-08-22 18:25:48 -070047import collections
liujisi@google.com33165fe2010-11-02 13:14:58 +000048import copy
49import math
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +000050import operator
51import pickle
Jisi Liu46e8ff62015-10-05 11:59:43 -070052import six
jieluo@google.combde4a322014-08-12 21:10:30 +000053import sys
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +000054
Jisi Liudbea00a2015-10-05 16:08:22 -070055try:
Jisi Liu3b3c8ab2016-03-30 11:39:59 -070056 import unittest2 as unittest #PY26
Jisi Liudbea00a2015-10-05 16:08:22 -070057except ImportError:
58 import unittest
Jisi Liu3b3c8ab2016-03-30 11:39:59 -070059
Jisi Liu885b6122015-02-28 14:51:22 -080060from google.protobuf.internal import _parameterized
Bo Yang5db21732015-05-21 14:28:59 -070061from google.protobuf import map_unittest_pb2
kenton@google.com80b1d622009-07-29 01:13:20 +000062from google.protobuf import unittest_pb2
Jisi Liuada65562015-02-25 16:39:11 -080063from google.protobuf import unittest_proto3_arena_pb2
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +000064from google.protobuf.internal import api_implementation
Feng Xiaoeee38b02015-08-22 18:25:48 -070065from google.protobuf.internal import packed_field_test_pb2
kenton@google.com80b1d622009-07-29 01:13:20 +000066from google.protobuf.internal import test_util
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +000067from google.protobuf import message
kenton@google.com80b1d622009-07-29 01:13:20 +000068
Jisi Liu46e8ff62015-10-05 11:59:43 -070069if six.PY3:
70 long = int
71
Jisi Liu3b3c8ab2016-03-30 11:39:59 -070072
liujisi@google.com33165fe2010-11-02 13:14:58 +000073# Python pre-2.6 does not have isinf() or isnan() functions, so we have
74# to provide our own.
75def isnan(val):
76 # NaN is never equal to itself.
77 return val != val
78def isinf(val):
79 # Infinity times zero equals NaN.
80 return not isnan(val) and isnan(val * 0)
81def IsPosInf(val):
82 return isinf(val) and (val > 0)
83def IsNegInf(val):
84 return isinf(val) and (val < 0)
kenton@google.com80b1d622009-07-29 01:13:20 +000085
jieluo@google.combde4a322014-08-12 21:10:30 +000086
Josh Haberman0b70a432015-02-25 20:17:32 -080087@_parameterized.Parameters(
Jisi Liuada65562015-02-25 16:39:11 -080088 (unittest_pb2),
89 (unittest_proto3_arena_pb2))
Tamir Duberstein9f42f5f2015-01-13 14:47:32 -050090class MessageTest(unittest.TestCase):
jieluo@google.combde4a322014-08-12 21:10:30 +000091
Jisi Liuada65562015-02-25 16:39:11 -080092 def testBadUtf8String(self, message_module):
jieluo@google.combde4a322014-08-12 21:10:30 +000093 if api_implementation.Type() != 'python':
94 self.skipTest("Skipping testBadUtf8String, currently only the python "
95 "api implementation raises UnicodeDecodeError when a "
96 "string field contains bad utf-8.")
97 bad_utf8_data = test_util.GoldenFileData('bad_utf8_string')
98 with self.assertRaises(UnicodeDecodeError) as context:
Jisi Liuada65562015-02-25 16:39:11 -080099 message_module.TestAllTypes.FromString(bad_utf8_data)
100 self.assertIn('TestAllTypes.optional_string', str(context.exception))
kenton@google.com80b1d622009-07-29 01:13:20 +0000101
Jisi Liuada65562015-02-25 16:39:11 -0800102 def testGoldenMessage(self, message_module):
103 # Proto3 doesn't have the "default_foo" members or foreign enums,
104 # and doesn't preserve unknown fields, so for proto3 we use a golden
105 # message that doesn't have these fields set.
106 if message_module is unittest_pb2:
107 golden_data = test_util.GoldenFileData(
108 'golden_message_oneof_implemented')
109 else:
110 golden_data = test_util.GoldenFileData('golden_message_proto3')
111
112 golden_message = message_module.TestAllTypes()
kenton@google.com80b1d622009-07-29 01:13:20 +0000113 golden_message.ParseFromString(golden_data)
Jisi Liuada65562015-02-25 16:39:11 -0800114 if message_module is unittest_pb2:
115 test_util.ExpectAllFieldsSet(self, golden_message)
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000116 self.assertEqual(golden_data, golden_message.SerializeToString())
liujisi@google.com33165fe2010-11-02 13:14:58 +0000117 golden_copy = copy.deepcopy(golden_message)
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000118 self.assertEqual(golden_data, golden_copy.SerializeToString())
kenton@google.com80b1d622009-07-29 01:13:20 +0000119
Jisi Liuada65562015-02-25 16:39:11 -0800120 def testGoldenPackedMessage(self, message_module):
jieluo@google.combde4a322014-08-12 21:10:30 +0000121 golden_data = test_util.GoldenFileData('golden_packed_fields_message')
Jisi Liuada65562015-02-25 16:39:11 -0800122 golden_message = message_module.TestPackedTypes()
kenton@google.comfccb1462009-12-18 02:11:36 +0000123 golden_message.ParseFromString(golden_data)
Jisi Liuada65562015-02-25 16:39:11 -0800124 all_set = message_module.TestPackedTypes()
kenton@google.comfccb1462009-12-18 02:11:36 +0000125 test_util.SetAllPackedFields(all_set)
Jisi Liuada65562015-02-25 16:39:11 -0800126 self.assertEqual(all_set, golden_message)
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000127 self.assertEqual(golden_data, all_set.SerializeToString())
liujisi@google.com33165fe2010-11-02 13:14:58 +0000128 golden_copy = copy.deepcopy(golden_message)
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000129 self.assertEqual(golden_data, golden_copy.SerializeToString())
kenton@google.comfccb1462009-12-18 02:11:36 +0000130
Jisi Liuada65562015-02-25 16:39:11 -0800131 def testPickleSupport(self, message_module):
jieluo@google.combde4a322014-08-12 21:10:30 +0000132 golden_data = test_util.GoldenFileData('golden_message')
Jisi Liuada65562015-02-25 16:39:11 -0800133 golden_message = message_module.TestAllTypes()
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000134 golden_message.ParseFromString(golden_data)
135 pickled_message = pickle.dumps(golden_message)
136
137 unpickled_message = pickle.loads(pickled_message)
Jisi Liuada65562015-02-25 16:39:11 -0800138 self.assertEqual(unpickled_message, golden_message)
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000139
Jisi Liuada65562015-02-25 16:39:11 -0800140 def testPositiveInfinity(self, message_module):
Bo Yang5db21732015-05-21 14:28:59 -0700141 if message_module is unittest_pb2:
142 golden_data = (b'\x5D\x00\x00\x80\x7F'
143 b'\x61\x00\x00\x00\x00\x00\x00\xF0\x7F'
144 b'\xCD\x02\x00\x00\x80\x7F'
145 b'\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\x7F')
146 else:
147 golden_data = (b'\x5D\x00\x00\x80\x7F'
148 b'\x61\x00\x00\x00\x00\x00\x00\xF0\x7F'
149 b'\xCA\x02\x04\x00\x00\x80\x7F'
150 b'\xD2\x02\x08\x00\x00\x00\x00\x00\x00\xF0\x7F')
151
Jisi Liuada65562015-02-25 16:39:11 -0800152 golden_message = message_module.TestAllTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000153 golden_message.ParseFromString(golden_data)
154 self.assertTrue(IsPosInf(golden_message.optional_float))
155 self.assertTrue(IsPosInf(golden_message.optional_double))
156 self.assertTrue(IsPosInf(golden_message.repeated_float[0]))
157 self.assertTrue(IsPosInf(golden_message.repeated_double[0]))
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000158 self.assertEqual(golden_data, golden_message.SerializeToString())
liujisi@google.com33165fe2010-11-02 13:14:58 +0000159
Jisi Liuada65562015-02-25 16:39:11 -0800160 def testNegativeInfinity(self, message_module):
Bo Yang5db21732015-05-21 14:28:59 -0700161 if message_module is unittest_pb2:
162 golden_data = (b'\x5D\x00\x00\x80\xFF'
163 b'\x61\x00\x00\x00\x00\x00\x00\xF0\xFF'
164 b'\xCD\x02\x00\x00\x80\xFF'
165 b'\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\xFF')
166 else:
167 golden_data = (b'\x5D\x00\x00\x80\xFF'
168 b'\x61\x00\x00\x00\x00\x00\x00\xF0\xFF'
169 b'\xCA\x02\x04\x00\x00\x80\xFF'
170 b'\xD2\x02\x08\x00\x00\x00\x00\x00\x00\xF0\xFF')
171
Jisi Liuada65562015-02-25 16:39:11 -0800172 golden_message = message_module.TestAllTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000173 golden_message.ParseFromString(golden_data)
174 self.assertTrue(IsNegInf(golden_message.optional_float))
175 self.assertTrue(IsNegInf(golden_message.optional_double))
176 self.assertTrue(IsNegInf(golden_message.repeated_float[0]))
177 self.assertTrue(IsNegInf(golden_message.repeated_double[0]))
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000178 self.assertEqual(golden_data, golden_message.SerializeToString())
liujisi@google.com33165fe2010-11-02 13:14:58 +0000179
Jisi Liuada65562015-02-25 16:39:11 -0800180 def testNotANumber(self, message_module):
jieluo@google.combde4a322014-08-12 21:10:30 +0000181 golden_data = (b'\x5D\x00\x00\xC0\x7F'
182 b'\x61\x00\x00\x00\x00\x00\x00\xF8\x7F'
183 b'\xCD\x02\x00\x00\xC0\x7F'
184 b'\xD1\x02\x00\x00\x00\x00\x00\x00\xF8\x7F')
Jisi Liuada65562015-02-25 16:39:11 -0800185 golden_message = message_module.TestAllTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000186 golden_message.ParseFromString(golden_data)
187 self.assertTrue(isnan(golden_message.optional_float))
188 self.assertTrue(isnan(golden_message.optional_double))
189 self.assertTrue(isnan(golden_message.repeated_float[0]))
190 self.assertTrue(isnan(golden_message.repeated_double[0]))
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000191
192 # The protocol buffer may serialize to any one of multiple different
193 # representations of a NaN. Rather than verify a specific representation,
194 # verify the serialized string can be converted into a correctly
195 # behaving protocol buffer.
196 serialized = golden_message.SerializeToString()
Jisi Liuada65562015-02-25 16:39:11 -0800197 message = message_module.TestAllTypes()
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000198 message.ParseFromString(serialized)
199 self.assertTrue(isnan(message.optional_float))
200 self.assertTrue(isnan(message.optional_double))
201 self.assertTrue(isnan(message.repeated_float[0]))
202 self.assertTrue(isnan(message.repeated_double[0]))
liujisi@google.com33165fe2010-11-02 13:14:58 +0000203
Jisi Liuada65562015-02-25 16:39:11 -0800204 def testPositiveInfinityPacked(self, message_module):
jieluo@google.combde4a322014-08-12 21:10:30 +0000205 golden_data = (b'\xA2\x06\x04\x00\x00\x80\x7F'
206 b'\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\x7F')
Jisi Liuada65562015-02-25 16:39:11 -0800207 golden_message = message_module.TestPackedTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000208 golden_message.ParseFromString(golden_data)
209 self.assertTrue(IsPosInf(golden_message.packed_float[0]))
210 self.assertTrue(IsPosInf(golden_message.packed_double[0]))
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000211 self.assertEqual(golden_data, golden_message.SerializeToString())
liujisi@google.com33165fe2010-11-02 13:14:58 +0000212
Jisi Liuada65562015-02-25 16:39:11 -0800213 def testNegativeInfinityPacked(self, message_module):
jieluo@google.combde4a322014-08-12 21:10:30 +0000214 golden_data = (b'\xA2\x06\x04\x00\x00\x80\xFF'
215 b'\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\xFF')
Jisi Liuada65562015-02-25 16:39:11 -0800216 golden_message = message_module.TestPackedTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000217 golden_message.ParseFromString(golden_data)
218 self.assertTrue(IsNegInf(golden_message.packed_float[0]))
219 self.assertTrue(IsNegInf(golden_message.packed_double[0]))
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000220 self.assertEqual(golden_data, golden_message.SerializeToString())
liujisi@google.com33165fe2010-11-02 13:14:58 +0000221
Jisi Liuada65562015-02-25 16:39:11 -0800222 def testNotANumberPacked(self, message_module):
jieluo@google.combde4a322014-08-12 21:10:30 +0000223 golden_data = (b'\xA2\x06\x04\x00\x00\xC0\x7F'
224 b'\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF8\x7F')
Jisi Liuada65562015-02-25 16:39:11 -0800225 golden_message = message_module.TestPackedTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000226 golden_message.ParseFromString(golden_data)
227 self.assertTrue(isnan(golden_message.packed_float[0]))
228 self.assertTrue(isnan(golden_message.packed_double[0]))
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000229
230 serialized = golden_message.SerializeToString()
Jisi Liuada65562015-02-25 16:39:11 -0800231 message = message_module.TestPackedTypes()
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000232 message.ParseFromString(serialized)
233 self.assertTrue(isnan(message.packed_float[0]))
234 self.assertTrue(isnan(message.packed_double[0]))
liujisi@google.com33165fe2010-11-02 13:14:58 +0000235
Jisi Liuada65562015-02-25 16:39:11 -0800236 def testExtremeFloatValues(self, message_module):
237 message = message_module.TestAllTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000238
239 # Most positive exponent, no significand bits set.
240 kMostPosExponentNoSigBits = math.pow(2, 127)
241 message.optional_float = kMostPosExponentNoSigBits
242 message.ParseFromString(message.SerializeToString())
243 self.assertTrue(message.optional_float == kMostPosExponentNoSigBits)
244
245 # Most positive exponent, one significand bit set.
246 kMostPosExponentOneSigBit = 1.5 * math.pow(2, 127)
247 message.optional_float = kMostPosExponentOneSigBit
248 message.ParseFromString(message.SerializeToString())
249 self.assertTrue(message.optional_float == kMostPosExponentOneSigBit)
250
251 # Repeat last two cases with values of same magnitude, but negative.
252 message.optional_float = -kMostPosExponentNoSigBits
253 message.ParseFromString(message.SerializeToString())
254 self.assertTrue(message.optional_float == -kMostPosExponentNoSigBits)
255
256 message.optional_float = -kMostPosExponentOneSigBit
257 message.ParseFromString(message.SerializeToString())
258 self.assertTrue(message.optional_float == -kMostPosExponentOneSigBit)
259
260 # Most negative exponent, no significand bits set.
261 kMostNegExponentNoSigBits = math.pow(2, -127)
262 message.optional_float = kMostNegExponentNoSigBits
263 message.ParseFromString(message.SerializeToString())
264 self.assertTrue(message.optional_float == kMostNegExponentNoSigBits)
265
266 # Most negative exponent, one significand bit set.
267 kMostNegExponentOneSigBit = 1.5 * math.pow(2, -127)
268 message.optional_float = kMostNegExponentOneSigBit
269 message.ParseFromString(message.SerializeToString())
270 self.assertTrue(message.optional_float == kMostNegExponentOneSigBit)
271
272 # Repeat last two cases with values of the same magnitude, but negative.
273 message.optional_float = -kMostNegExponentNoSigBits
274 message.ParseFromString(message.SerializeToString())
275 self.assertTrue(message.optional_float == -kMostNegExponentNoSigBits)
276
277 message.optional_float = -kMostNegExponentOneSigBit
278 message.ParseFromString(message.SerializeToString())
279 self.assertTrue(message.optional_float == -kMostNegExponentOneSigBit)
280
Jisi Liuada65562015-02-25 16:39:11 -0800281 def testExtremeDoubleValues(self, message_module):
282 message = message_module.TestAllTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000283
284 # Most positive exponent, no significand bits set.
285 kMostPosExponentNoSigBits = math.pow(2, 1023)
286 message.optional_double = kMostPosExponentNoSigBits
287 message.ParseFromString(message.SerializeToString())
288 self.assertTrue(message.optional_double == kMostPosExponentNoSigBits)
289
290 # Most positive exponent, one significand bit set.
291 kMostPosExponentOneSigBit = 1.5 * math.pow(2, 1023)
292 message.optional_double = kMostPosExponentOneSigBit
293 message.ParseFromString(message.SerializeToString())
294 self.assertTrue(message.optional_double == kMostPosExponentOneSigBit)
295
296 # Repeat last two cases with values of same magnitude, but negative.
297 message.optional_double = -kMostPosExponentNoSigBits
298 message.ParseFromString(message.SerializeToString())
299 self.assertTrue(message.optional_double == -kMostPosExponentNoSigBits)
300
301 message.optional_double = -kMostPosExponentOneSigBit
302 message.ParseFromString(message.SerializeToString())
303 self.assertTrue(message.optional_double == -kMostPosExponentOneSigBit)
304
305 # Most negative exponent, no significand bits set.
306 kMostNegExponentNoSigBits = math.pow(2, -1023)
307 message.optional_double = kMostNegExponentNoSigBits
308 message.ParseFromString(message.SerializeToString())
309 self.assertTrue(message.optional_double == kMostNegExponentNoSigBits)
310
311 # Most negative exponent, one significand bit set.
312 kMostNegExponentOneSigBit = 1.5 * math.pow(2, -1023)
313 message.optional_double = kMostNegExponentOneSigBit
314 message.ParseFromString(message.SerializeToString())
315 self.assertTrue(message.optional_double == kMostNegExponentOneSigBit)
316
317 # Repeat last two cases with values of the same magnitude, but negative.
318 message.optional_double = -kMostNegExponentNoSigBits
319 message.ParseFromString(message.SerializeToString())
320 self.assertTrue(message.optional_double == -kMostNegExponentNoSigBits)
321
322 message.optional_double = -kMostNegExponentOneSigBit
323 message.ParseFromString(message.SerializeToString())
324 self.assertTrue(message.optional_double == -kMostNegExponentOneSigBit)
325
Jisi Liuada65562015-02-25 16:39:11 -0800326 def testFloatPrinting(self, message_module):
327 message = message_module.TestAllTypes()
jieluo@google.combde4a322014-08-12 21:10:30 +0000328 message.optional_float = 2.0
329 self.assertEqual(str(message), 'optional_float: 2.0\n')
330
Jisi Liuada65562015-02-25 16:39:11 -0800331 def testHighPrecisionFloatPrinting(self, message_module):
332 message = message_module.TestAllTypes()
jieluo@google.combde4a322014-08-12 21:10:30 +0000333 message.optional_double = 0.12345678912345678
Dan O'Reilly2621c8a2015-08-14 22:54:53 -0400334 if sys.version_info >= (3,):
jieluo@google.combde4a322014-08-12 21:10:30 +0000335 self.assertEqual(str(message), 'optional_double: 0.12345678912345678\n')
336 else:
337 self.assertEqual(str(message), 'optional_double: 0.123456789123\n')
338
Jisi Liuada65562015-02-25 16:39:11 -0800339 def testUnknownFieldPrinting(self, message_module):
340 populated = message_module.TestAllTypes()
jieluo@google.combde4a322014-08-12 21:10:30 +0000341 test_util.SetAllNonLazyFields(populated)
Jisi Liuada65562015-02-25 16:39:11 -0800342 empty = message_module.TestEmptyMessage()
jieluo@google.combde4a322014-08-12 21:10:30 +0000343 empty.ParseFromString(populated.SerializeToString())
344 self.assertEqual(str(empty), '')
345
Jisi Liuada65562015-02-25 16:39:11 -0800346 def testRepeatedNestedFieldIteration(self, message_module):
347 msg = message_module.TestAllTypes()
Feng Xiao6ef984a2014-11-10 17:34:54 -0800348 msg.repeated_nested_message.add(bb=1)
349 msg.repeated_nested_message.add(bb=2)
350 msg.repeated_nested_message.add(bb=3)
351 msg.repeated_nested_message.add(bb=4)
352
Jisi Liuada65562015-02-25 16:39:11 -0800353 self.assertEqual([1, 2, 3, 4],
354 [m.bb for m in msg.repeated_nested_message])
355 self.assertEqual([4, 3, 2, 1],
356 [m.bb for m in reversed(msg.repeated_nested_message)])
357 self.assertEqual([4, 3, 2, 1],
358 [m.bb for m in msg.repeated_nested_message[::-1]])
Feng Xiao6ef984a2014-11-10 17:34:54 -0800359
Jisi Liuada65562015-02-25 16:39:11 -0800360 def testSortingRepeatedScalarFieldsDefaultComparator(self, message_module):
liujisi@google.com33165fe2010-11-02 13:14:58 +0000361 """Check some different types with the default comparator."""
Jisi Liuada65562015-02-25 16:39:11 -0800362 message = message_module.TestAllTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000363
364 # TODO(mattp): would testing more scalar types strengthen test?
365 message.repeated_int32.append(1)
366 message.repeated_int32.append(3)
367 message.repeated_int32.append(2)
368 message.repeated_int32.sort()
369 self.assertEqual(message.repeated_int32[0], 1)
370 self.assertEqual(message.repeated_int32[1], 2)
371 self.assertEqual(message.repeated_int32[2], 3)
372
373 message.repeated_float.append(1.1)
374 message.repeated_float.append(1.3)
375 message.repeated_float.append(1.2)
376 message.repeated_float.sort()
377 self.assertAlmostEqual(message.repeated_float[0], 1.1)
378 self.assertAlmostEqual(message.repeated_float[1], 1.2)
379 self.assertAlmostEqual(message.repeated_float[2], 1.3)
380
381 message.repeated_string.append('a')
382 message.repeated_string.append('c')
383 message.repeated_string.append('b')
384 message.repeated_string.sort()
385 self.assertEqual(message.repeated_string[0], 'a')
386 self.assertEqual(message.repeated_string[1], 'b')
387 self.assertEqual(message.repeated_string[2], 'c')
388
jieluo@google.combde4a322014-08-12 21:10:30 +0000389 message.repeated_bytes.append(b'a')
390 message.repeated_bytes.append(b'c')
391 message.repeated_bytes.append(b'b')
liujisi@google.com33165fe2010-11-02 13:14:58 +0000392 message.repeated_bytes.sort()
jieluo@google.combde4a322014-08-12 21:10:30 +0000393 self.assertEqual(message.repeated_bytes[0], b'a')
394 self.assertEqual(message.repeated_bytes[1], b'b')
395 self.assertEqual(message.repeated_bytes[2], b'c')
liujisi@google.com33165fe2010-11-02 13:14:58 +0000396
Jisi Liuada65562015-02-25 16:39:11 -0800397 def testSortingRepeatedScalarFieldsCustomComparator(self, message_module):
liujisi@google.com33165fe2010-11-02 13:14:58 +0000398 """Check some different types with custom comparator."""
Jisi Liuada65562015-02-25 16:39:11 -0800399 message = message_module.TestAllTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000400
401 message.repeated_int32.append(-3)
402 message.repeated_int32.append(-2)
403 message.repeated_int32.append(-1)
jieluo@google.combde4a322014-08-12 21:10:30 +0000404 message.repeated_int32.sort(key=abs)
liujisi@google.com33165fe2010-11-02 13:14:58 +0000405 self.assertEqual(message.repeated_int32[0], -1)
406 self.assertEqual(message.repeated_int32[1], -2)
407 self.assertEqual(message.repeated_int32[2], -3)
408
409 message.repeated_string.append('aaa')
410 message.repeated_string.append('bb')
411 message.repeated_string.append('c')
jieluo@google.combde4a322014-08-12 21:10:30 +0000412 message.repeated_string.sort(key=len)
liujisi@google.com33165fe2010-11-02 13:14:58 +0000413 self.assertEqual(message.repeated_string[0], 'c')
414 self.assertEqual(message.repeated_string[1], 'bb')
415 self.assertEqual(message.repeated_string[2], 'aaa')
416
Jisi Liuada65562015-02-25 16:39:11 -0800417 def testSortingRepeatedCompositeFieldsCustomComparator(self, message_module):
liujisi@google.com33165fe2010-11-02 13:14:58 +0000418 """Check passing a custom comparator to sort a repeated composite field."""
Jisi Liuada65562015-02-25 16:39:11 -0800419 message = message_module.TestAllTypes()
liujisi@google.com33165fe2010-11-02 13:14:58 +0000420
421 message.repeated_nested_message.add().bb = 1
422 message.repeated_nested_message.add().bb = 3
423 message.repeated_nested_message.add().bb = 2
424 message.repeated_nested_message.add().bb = 6
425 message.repeated_nested_message.add().bb = 5
426 message.repeated_nested_message.add().bb = 4
jieluo@google.combde4a322014-08-12 21:10:30 +0000427 message.repeated_nested_message.sort(key=operator.attrgetter('bb'))
liujisi@google.com33165fe2010-11-02 13:14:58 +0000428 self.assertEqual(message.repeated_nested_message[0].bb, 1)
429 self.assertEqual(message.repeated_nested_message[1].bb, 2)
430 self.assertEqual(message.repeated_nested_message[2].bb, 3)
431 self.assertEqual(message.repeated_nested_message[3].bb, 4)
432 self.assertEqual(message.repeated_nested_message[4].bb, 5)
433 self.assertEqual(message.repeated_nested_message[5].bb, 6)
434
Feng Xiaoeee38b02015-08-22 18:25:48 -0700435 def testSortingRepeatedCompositeFieldsStable(self, message_module):
436 """Check passing a custom comparator to sort a repeated composite field."""
437 message = message_module.TestAllTypes()
438
439 message.repeated_nested_message.add().bb = 21
440 message.repeated_nested_message.add().bb = 20
441 message.repeated_nested_message.add().bb = 13
442 message.repeated_nested_message.add().bb = 33
443 message.repeated_nested_message.add().bb = 11
444 message.repeated_nested_message.add().bb = 24
445 message.repeated_nested_message.add().bb = 10
446 message.repeated_nested_message.sort(key=lambda z: z.bb // 10)
Jisi Liu46e8ff62015-10-05 11:59:43 -0700447 self.assertEqual(
Feng Xiaoeee38b02015-08-22 18:25:48 -0700448 [13, 11, 10, 21, 20, 24, 33],
449 [n.bb for n in message.repeated_nested_message])
450
451 # Make sure that for the C++ implementation, the underlying fields
452 # are actually reordered.
453 pb = message.SerializeToString()
454 message.Clear()
455 message.MergeFromString(pb)
Jisi Liu46e8ff62015-10-05 11:59:43 -0700456 self.assertEqual(
Feng Xiaoeee38b02015-08-22 18:25:48 -0700457 [13, 11, 10, 21, 20, 24, 33],
458 [n.bb for n in message.repeated_nested_message])
459
Jisi Liuada65562015-02-25 16:39:11 -0800460 def testRepeatedCompositeFieldSortArguments(self, message_module):
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000461 """Check sorting a repeated composite field using list.sort() arguments."""
Jisi Liuada65562015-02-25 16:39:11 -0800462 message = message_module.TestAllTypes()
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000463
464 get_bb = operator.attrgetter('bb')
465 cmp_bb = lambda a, b: cmp(a.bb, b.bb)
466 message.repeated_nested_message.add().bb = 1
467 message.repeated_nested_message.add().bb = 3
468 message.repeated_nested_message.add().bb = 2
469 message.repeated_nested_message.add().bb = 6
470 message.repeated_nested_message.add().bb = 5
471 message.repeated_nested_message.add().bb = 4
472 message.repeated_nested_message.sort(key=get_bb)
473 self.assertEqual([k.bb for k in message.repeated_nested_message],
474 [1, 2, 3, 4, 5, 6])
475 message.repeated_nested_message.sort(key=get_bb, reverse=True)
476 self.assertEqual([k.bb for k in message.repeated_nested_message],
477 [6, 5, 4, 3, 2, 1])
Dan O'Reilly2621c8a2015-08-14 22:54:53 -0400478 if sys.version_info >= (3,): return # No cmp sorting in PY3.
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000479 message.repeated_nested_message.sort(sort_function=cmp_bb)
480 self.assertEqual([k.bb for k in message.repeated_nested_message],
481 [1, 2, 3, 4, 5, 6])
482 message.repeated_nested_message.sort(cmp=cmp_bb, reverse=True)
483 self.assertEqual([k.bb for k in message.repeated_nested_message],
484 [6, 5, 4, 3, 2, 1])
485
Jisi Liuada65562015-02-25 16:39:11 -0800486 def testRepeatedScalarFieldSortArguments(self, message_module):
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000487 """Check sorting a scalar field using list.sort() arguments."""
Jisi Liuada65562015-02-25 16:39:11 -0800488 message = message_module.TestAllTypes()
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000489
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000490 message.repeated_int32.append(-3)
491 message.repeated_int32.append(-2)
492 message.repeated_int32.append(-1)
493 message.repeated_int32.sort(key=abs)
494 self.assertEqual(list(message.repeated_int32), [-1, -2, -3])
495 message.repeated_int32.sort(key=abs, reverse=True)
496 self.assertEqual(list(message.repeated_int32), [-3, -2, -1])
Dan O'Reilly2621c8a2015-08-14 22:54:53 -0400497 if sys.version_info < (3,): # No cmp sorting in PY3.
jieluo@google.combde4a322014-08-12 21:10:30 +0000498 abs_cmp = lambda a, b: cmp(abs(a), abs(b))
499 message.repeated_int32.sort(sort_function=abs_cmp)
500 self.assertEqual(list(message.repeated_int32), [-1, -2, -3])
501 message.repeated_int32.sort(cmp=abs_cmp, reverse=True)
502 self.assertEqual(list(message.repeated_int32), [-3, -2, -1])
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000503
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000504 message.repeated_string.append('aaa')
505 message.repeated_string.append('bb')
506 message.repeated_string.append('c')
507 message.repeated_string.sort(key=len)
508 self.assertEqual(list(message.repeated_string), ['c', 'bb', 'aaa'])
509 message.repeated_string.sort(key=len, reverse=True)
510 self.assertEqual(list(message.repeated_string), ['aaa', 'bb', 'c'])
Dan O'Reilly2621c8a2015-08-14 22:54:53 -0400511 if sys.version_info < (3,): # No cmp sorting in PY3.
jieluo@google.combde4a322014-08-12 21:10:30 +0000512 len_cmp = lambda a, b: cmp(len(a), len(b))
513 message.repeated_string.sort(sort_function=len_cmp)
514 self.assertEqual(list(message.repeated_string), ['c', 'bb', 'aaa'])
515 message.repeated_string.sort(cmp=len_cmp, reverse=True)
516 self.assertEqual(list(message.repeated_string), ['aaa', 'bb', 'c'])
517
Jisi Liuada65562015-02-25 16:39:11 -0800518 def testRepeatedFieldsComparable(self, message_module):
519 m1 = message_module.TestAllTypes()
520 m2 = message_module.TestAllTypes()
jieluo@google.combde4a322014-08-12 21:10:30 +0000521 m1.repeated_int32.append(0)
522 m1.repeated_int32.append(1)
523 m1.repeated_int32.append(2)
524 m2.repeated_int32.append(0)
525 m2.repeated_int32.append(1)
526 m2.repeated_int32.append(2)
527 m1.repeated_nested_message.add().bb = 1
528 m1.repeated_nested_message.add().bb = 2
529 m1.repeated_nested_message.add().bb = 3
530 m2.repeated_nested_message.add().bb = 1
531 m2.repeated_nested_message.add().bb = 2
532 m2.repeated_nested_message.add().bb = 3
533
Dan O'Reilly2621c8a2015-08-14 22:54:53 -0400534 if sys.version_info >= (3,): return # No cmp() in PY3.
jieluo@google.combde4a322014-08-12 21:10:30 +0000535
536 # These comparisons should not raise errors.
537 _ = m1 < m2
538 _ = m1.repeated_nested_message < m2.repeated_nested_message
539
540 # Make sure cmp always works. If it wasn't defined, these would be
541 # id() comparisons and would all fail.
542 self.assertEqual(cmp(m1, m2), 0)
543 self.assertEqual(cmp(m1.repeated_int32, m2.repeated_int32), 0)
544 self.assertEqual(cmp(m1.repeated_int32, [0, 1, 2]), 0)
545 self.assertEqual(cmp(m1.repeated_nested_message,
546 m2.repeated_nested_message), 0)
547 with self.assertRaises(TypeError):
548 # Can't compare repeated composite containers to lists.
549 cmp(m1.repeated_nested_message, m2.repeated_nested_message[:])
550
551 # TODO(anuraag): Implement extensiondict comparison in C++ and then add test
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +0000552
Feng Xiaoeee38b02015-08-22 18:25:48 -0700553 def testRepeatedFieldsAreSequences(self, message_module):
554 m = message_module.TestAllTypes()
555 self.assertIsInstance(m.repeated_int32, collections.MutableSequence)
556 self.assertIsInstance(m.repeated_nested_message,
557 collections.MutableSequence)
558
Jisi Liuada65562015-02-25 16:39:11 -0800559 def ensureNestedMessageExists(self, msg, attribute):
560 """Make sure that a nested message object exists.
561
562 As soon as a nested message attribute is accessed, it will be present in the
563 _fields dict, without being marked as actually being set.
564 """
565 getattr(msg, attribute)
566 self.assertFalse(msg.HasField(attribute))
567
568 def testOneofGetCaseNonexistingField(self, message_module):
569 m = message_module.TestAllTypes()
570 self.assertRaises(ValueError, m.WhichOneof, 'no_such_oneof_field')
571
572 def testOneofDefaultValues(self, message_module):
573 m = message_module.TestAllTypes()
574 self.assertIs(None, m.WhichOneof('oneof_field'))
575 self.assertFalse(m.HasField('oneof_uint32'))
576
577 # Oneof is set even when setting it to a default value.
578 m.oneof_uint32 = 0
579 self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
580 self.assertTrue(m.HasField('oneof_uint32'))
581 self.assertFalse(m.HasField('oneof_string'))
582
583 m.oneof_string = ""
584 self.assertEqual('oneof_string', m.WhichOneof('oneof_field'))
585 self.assertTrue(m.HasField('oneof_string'))
586 self.assertFalse(m.HasField('oneof_uint32'))
587
588 def testOneofSemantics(self, message_module):
589 m = message_module.TestAllTypes()
590 self.assertIs(None, m.WhichOneof('oneof_field'))
591
592 m.oneof_uint32 = 11
593 self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
594 self.assertTrue(m.HasField('oneof_uint32'))
595
596 m.oneof_string = u'foo'
597 self.assertEqual('oneof_string', m.WhichOneof('oneof_field'))
598 self.assertFalse(m.HasField('oneof_uint32'))
599 self.assertTrue(m.HasField('oneof_string'))
600
Feng Xiaoeee38b02015-08-22 18:25:48 -0700601 # Read nested message accessor without accessing submessage.
602 m.oneof_nested_message
603 self.assertEqual('oneof_string', m.WhichOneof('oneof_field'))
604 self.assertTrue(m.HasField('oneof_string'))
605 self.assertFalse(m.HasField('oneof_nested_message'))
606
607 # Read accessor of nested message without accessing submessage.
608 m.oneof_nested_message.bb
609 self.assertEqual('oneof_string', m.WhichOneof('oneof_field'))
610 self.assertTrue(m.HasField('oneof_string'))
611 self.assertFalse(m.HasField('oneof_nested_message'))
612
Jisi Liuada65562015-02-25 16:39:11 -0800613 m.oneof_nested_message.bb = 11
614 self.assertEqual('oneof_nested_message', m.WhichOneof('oneof_field'))
615 self.assertFalse(m.HasField('oneof_string'))
616 self.assertTrue(m.HasField('oneof_nested_message'))
617
618 m.oneof_bytes = b'bb'
619 self.assertEqual('oneof_bytes', m.WhichOneof('oneof_field'))
620 self.assertFalse(m.HasField('oneof_nested_message'))
621 self.assertTrue(m.HasField('oneof_bytes'))
622
623 def testOneofCompositeFieldReadAccess(self, message_module):
624 m = message_module.TestAllTypes()
625 m.oneof_uint32 = 11
626
627 self.ensureNestedMessageExists(m, 'oneof_nested_message')
628 self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
629 self.assertEqual(11, m.oneof_uint32)
630
631 def testOneofWhichOneof(self, message_module):
632 m = message_module.TestAllTypes()
633 self.assertIs(None, m.WhichOneof('oneof_field'))
634 if message_module is unittest_pb2:
635 self.assertFalse(m.HasField('oneof_field'))
636
637 m.oneof_uint32 = 11
638 self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
639 if message_module is unittest_pb2:
640 self.assertTrue(m.HasField('oneof_field'))
641
642 m.oneof_bytes = b'bb'
643 self.assertEqual('oneof_bytes', m.WhichOneof('oneof_field'))
644
645 m.ClearField('oneof_bytes')
646 self.assertIs(None, m.WhichOneof('oneof_field'))
647 if message_module is unittest_pb2:
648 self.assertFalse(m.HasField('oneof_field'))
649
650 def testOneofClearField(self, message_module):
651 m = message_module.TestAllTypes()
652 m.oneof_uint32 = 11
653 m.ClearField('oneof_field')
654 if message_module is unittest_pb2:
655 self.assertFalse(m.HasField('oneof_field'))
656 self.assertFalse(m.HasField('oneof_uint32'))
657 self.assertIs(None, m.WhichOneof('oneof_field'))
658
659 def testOneofClearSetField(self, message_module):
660 m = message_module.TestAllTypes()
661 m.oneof_uint32 = 11
662 m.ClearField('oneof_uint32')
663 if message_module is unittest_pb2:
664 self.assertFalse(m.HasField('oneof_field'))
665 self.assertFalse(m.HasField('oneof_uint32'))
666 self.assertIs(None, m.WhichOneof('oneof_field'))
667
668 def testOneofClearUnsetField(self, message_module):
669 m = message_module.TestAllTypes()
670 m.oneof_uint32 = 11
671 self.ensureNestedMessageExists(m, 'oneof_nested_message')
672 m.ClearField('oneof_nested_message')
673 self.assertEqual(11, m.oneof_uint32)
674 if message_module is unittest_pb2:
675 self.assertTrue(m.HasField('oneof_field'))
676 self.assertTrue(m.HasField('oneof_uint32'))
677 self.assertEqual('oneof_uint32', m.WhichOneof('oneof_field'))
678
679 def testOneofDeserialize(self, message_module):
680 m = message_module.TestAllTypes()
681 m.oneof_uint32 = 11
682 m2 = message_module.TestAllTypes()
683 m2.ParseFromString(m.SerializeToString())
684 self.assertEqual('oneof_uint32', m2.WhichOneof('oneof_field'))
685
686 def testOneofCopyFrom(self, message_module):
687 m = message_module.TestAllTypes()
688 m.oneof_uint32 = 11
689 m2 = message_module.TestAllTypes()
690 m2.CopyFrom(m)
691 self.assertEqual('oneof_uint32', m2.WhichOneof('oneof_field'))
692
693 def testOneofNestedMergeFrom(self, message_module):
694 m = message_module.NestedTestAllTypes()
695 m.payload.oneof_uint32 = 11
696 m2 = message_module.NestedTestAllTypes()
697 m2.payload.oneof_bytes = b'bb'
698 m2.child.payload.oneof_bytes = b'bb'
699 m2.MergeFrom(m)
700 self.assertEqual('oneof_uint32', m2.payload.WhichOneof('oneof_field'))
701 self.assertEqual('oneof_bytes', m2.child.payload.WhichOneof('oneof_field'))
702
703 def testOneofMessageMergeFrom(self, message_module):
704 m = message_module.NestedTestAllTypes()
705 m.payload.oneof_nested_message.bb = 11
706 m.child.payload.oneof_nested_message.bb = 12
707 m2 = message_module.NestedTestAllTypes()
708 m2.payload.oneof_uint32 = 13
709 m2.MergeFrom(m)
710 self.assertEqual('oneof_nested_message',
711 m2.payload.WhichOneof('oneof_field'))
712 self.assertEqual('oneof_nested_message',
713 m2.child.payload.WhichOneof('oneof_field'))
714
715 def testOneofNestedMessageInit(self, message_module):
716 m = message_module.TestAllTypes(
717 oneof_nested_message=message_module.TestAllTypes.NestedMessage())
718 self.assertEqual('oneof_nested_message', m.WhichOneof('oneof_field'))
719
720 def testOneofClear(self, message_module):
721 m = message_module.TestAllTypes()
722 m.oneof_uint32 = 11
723 m.Clear()
724 self.assertIsNone(m.WhichOneof('oneof_field'))
725 m.oneof_bytes = b'bb'
726 self.assertEqual('oneof_bytes', m.WhichOneof('oneof_field'))
727
728 def testAssignByteStringToUnicodeField(self, message_module):
729 """Assigning a byte string to a string field should result
730 in the value being converted to a Unicode string."""
731 m = message_module.TestAllTypes()
732 m.optional_string = str('')
Tamir Duberstein821fcb22015-08-12 14:22:25 -0400733 self.assertIsInstance(m.optional_string, six.text_type)
Jisi Liuada65562015-02-25 16:39:11 -0800734
735 def testLongValuedSlice(self, message_module):
736 """It should be possible to use long-valued indicies in slices
737
738 This didn't used to work in the v2 C++ implementation.
739 """
740 m = message_module.TestAllTypes()
741
742 # Repeated scalar
743 m.repeated_int32.append(1)
744 sl = m.repeated_int32[long(0):long(len(m.repeated_int32))]
745 self.assertEqual(len(m.repeated_int32), len(sl))
746
747 # Repeated composite
748 m.repeated_nested_message.add().bb = 3
749 sl = m.repeated_nested_message[long(0):long(len(m.repeated_nested_message))]
750 self.assertEqual(len(m.repeated_nested_message), len(sl))
751
752 def testExtendShouldNotSwallowExceptions(self, message_module):
753 """This didn't use to work in the v2 C++ implementation."""
754 m = message_module.TestAllTypes()
755 with self.assertRaises(NameError) as _:
756 m.repeated_int32.extend(a for i in range(10)) # pylint: disable=undefined-variable
757 with self.assertRaises(NameError) as _:
758 m.repeated_nested_enum.extend(
759 a for i in range(10)) # pylint: disable=undefined-variable
760
761 FALSY_VALUES = [None, False, 0, 0.0, b'', u'', bytearray(), [], {}, set()]
762
763 def testExtendInt32WithNothing(self, message_module):
764 """Test no-ops extending repeated int32 fields."""
765 m = message_module.TestAllTypes()
766 self.assertSequenceEqual([], m.repeated_int32)
767
768 # TODO(ptucker): Deprecate this behavior. b/18413862
769 for falsy_value in MessageTest.FALSY_VALUES:
770 m.repeated_int32.extend(falsy_value)
771 self.assertSequenceEqual([], m.repeated_int32)
772
773 m.repeated_int32.extend([])
774 self.assertSequenceEqual([], m.repeated_int32)
775
776 def testExtendFloatWithNothing(self, message_module):
777 """Test no-ops extending repeated float fields."""
778 m = message_module.TestAllTypes()
779 self.assertSequenceEqual([], m.repeated_float)
780
781 # TODO(ptucker): Deprecate this behavior. b/18413862
782 for falsy_value in MessageTest.FALSY_VALUES:
783 m.repeated_float.extend(falsy_value)
784 self.assertSequenceEqual([], m.repeated_float)
785
786 m.repeated_float.extend([])
787 self.assertSequenceEqual([], m.repeated_float)
788
789 def testExtendStringWithNothing(self, message_module):
790 """Test no-ops extending repeated string fields."""
791 m = message_module.TestAllTypes()
792 self.assertSequenceEqual([], m.repeated_string)
793
794 # TODO(ptucker): Deprecate this behavior. b/18413862
795 for falsy_value in MessageTest.FALSY_VALUES:
796 m.repeated_string.extend(falsy_value)
797 self.assertSequenceEqual([], m.repeated_string)
798
799 m.repeated_string.extend([])
800 self.assertSequenceEqual([], m.repeated_string)
801
802 def testExtendInt32WithPythonList(self, message_module):
803 """Test extending repeated int32 fields with python lists."""
804 m = message_module.TestAllTypes()
805 self.assertSequenceEqual([], m.repeated_int32)
806 m.repeated_int32.extend([0])
807 self.assertSequenceEqual([0], m.repeated_int32)
808 m.repeated_int32.extend([1, 2])
809 self.assertSequenceEqual([0, 1, 2], m.repeated_int32)
810 m.repeated_int32.extend([3, 4])
811 self.assertSequenceEqual([0, 1, 2, 3, 4], m.repeated_int32)
812
813 def testExtendFloatWithPythonList(self, message_module):
814 """Test extending repeated float fields with python lists."""
815 m = message_module.TestAllTypes()
816 self.assertSequenceEqual([], m.repeated_float)
817 m.repeated_float.extend([0.0])
818 self.assertSequenceEqual([0.0], m.repeated_float)
819 m.repeated_float.extend([1.0, 2.0])
820 self.assertSequenceEqual([0.0, 1.0, 2.0], m.repeated_float)
821 m.repeated_float.extend([3.0, 4.0])
822 self.assertSequenceEqual([0.0, 1.0, 2.0, 3.0, 4.0], m.repeated_float)
823
824 def testExtendStringWithPythonList(self, message_module):
825 """Test extending repeated string fields with python lists."""
826 m = message_module.TestAllTypes()
827 self.assertSequenceEqual([], m.repeated_string)
828 m.repeated_string.extend([''])
829 self.assertSequenceEqual([''], m.repeated_string)
830 m.repeated_string.extend(['11', '22'])
831 self.assertSequenceEqual(['', '11', '22'], m.repeated_string)
832 m.repeated_string.extend(['33', '44'])
833 self.assertSequenceEqual(['', '11', '22', '33', '44'], m.repeated_string)
834
835 def testExtendStringWithString(self, message_module):
836 """Test extending repeated string fields with characters from a string."""
837 m = message_module.TestAllTypes()
838 self.assertSequenceEqual([], m.repeated_string)
839 m.repeated_string.extend('abc')
840 self.assertSequenceEqual(['a', 'b', 'c'], m.repeated_string)
841
842 class TestIterable(object):
843 """This iterable object mimics the behavior of numpy.array.
844
845 __nonzero__ fails for length > 1, and returns bool(item[0]) for length == 1.
846
847 """
848
849 def __init__(self, values=None):
850 self._list = values or []
851
852 def __nonzero__(self):
853 size = len(self._list)
854 if size == 0:
855 return False
856 if size == 1:
857 return bool(self._list[0])
858 raise ValueError('Truth value is ambiguous.')
859
860 def __len__(self):
861 return len(self._list)
862
863 def __iter__(self):
864 return self._list.__iter__()
865
866 def testExtendInt32WithIterable(self, message_module):
867 """Test extending repeated int32 fields with iterable."""
868 m = message_module.TestAllTypes()
869 self.assertSequenceEqual([], m.repeated_int32)
870 m.repeated_int32.extend(MessageTest.TestIterable([]))
871 self.assertSequenceEqual([], m.repeated_int32)
872 m.repeated_int32.extend(MessageTest.TestIterable([0]))
873 self.assertSequenceEqual([0], m.repeated_int32)
874 m.repeated_int32.extend(MessageTest.TestIterable([1, 2]))
875 self.assertSequenceEqual([0, 1, 2], m.repeated_int32)
876 m.repeated_int32.extend(MessageTest.TestIterable([3, 4]))
877 self.assertSequenceEqual([0, 1, 2, 3, 4], m.repeated_int32)
878
879 def testExtendFloatWithIterable(self, message_module):
880 """Test extending repeated float fields with iterable."""
881 m = message_module.TestAllTypes()
882 self.assertSequenceEqual([], m.repeated_float)
883 m.repeated_float.extend(MessageTest.TestIterable([]))
884 self.assertSequenceEqual([], m.repeated_float)
885 m.repeated_float.extend(MessageTest.TestIterable([0.0]))
886 self.assertSequenceEqual([0.0], m.repeated_float)
887 m.repeated_float.extend(MessageTest.TestIterable([1.0, 2.0]))
888 self.assertSequenceEqual([0.0, 1.0, 2.0], m.repeated_float)
889 m.repeated_float.extend(MessageTest.TestIterable([3.0, 4.0]))
890 self.assertSequenceEqual([0.0, 1.0, 2.0, 3.0, 4.0], m.repeated_float)
891
892 def testExtendStringWithIterable(self, message_module):
893 """Test extending repeated string fields with iterable."""
894 m = message_module.TestAllTypes()
895 self.assertSequenceEqual([], m.repeated_string)
896 m.repeated_string.extend(MessageTest.TestIterable([]))
897 self.assertSequenceEqual([], m.repeated_string)
898 m.repeated_string.extend(MessageTest.TestIterable(['']))
899 self.assertSequenceEqual([''], m.repeated_string)
900 m.repeated_string.extend(MessageTest.TestIterable(['1', '2']))
901 self.assertSequenceEqual(['', '1', '2'], m.repeated_string)
902 m.repeated_string.extend(MessageTest.TestIterable(['3', '4']))
903 self.assertSequenceEqual(['', '1', '2', '3', '4'], m.repeated_string)
904
905 def testPickleRepeatedScalarContainer(self, message_module):
906 # TODO(tibell): The pure-Python implementation support pickling of
907 # scalar containers in *some* cases. For now the cpp2 version
908 # throws an exception to avoid a segfault. Investigate if we
909 # want to support pickling of these fields.
910 #
911 # For more information see: https://b2.corp.google.com/u/0/issues/18677897
912 if (api_implementation.Type() != 'cpp' or
913 api_implementation.Version() == 2):
914 return
915 m = message_module.TestAllTypes()
916 with self.assertRaises(pickle.PickleError) as _:
917 pickle.dumps(m.repeated_int32, pickle.HIGHEST_PROTOCOL)
918
Jisi Liuada65562015-02-25 16:39:11 -0800919 def testSortEmptyRepeatedCompositeContainer(self, message_module):
920 """Exercise a scenario that has led to segfaults in the past.
921 """
922 m = message_module.TestAllTypes()
923 m.repeated_nested_message.sort()
924
925 def testHasFieldOnRepeatedField(self, message_module):
926 """Using HasField on a repeated field should raise an exception.
927 """
928 m = message_module.TestAllTypes()
929 with self.assertRaises(ValueError) as _:
930 m.HasField('repeated_int32')
931
932 def testRepeatedScalarFieldPop(self, message_module):
933 m = message_module.TestAllTypes()
934 with self.assertRaises(IndexError) as _:
935 m.repeated_int32.pop()
936 m.repeated_int32.extend(range(5))
937 self.assertEqual(4, m.repeated_int32.pop())
938 self.assertEqual(0, m.repeated_int32.pop(0))
939 self.assertEqual(2, m.repeated_int32.pop(1))
940 self.assertEqual([1, 3], m.repeated_int32)
941
942 def testRepeatedCompositeFieldPop(self, message_module):
943 m = message_module.TestAllTypes()
944 with self.assertRaises(IndexError) as _:
945 m.repeated_nested_message.pop()
946 for i in range(5):
947 n = m.repeated_nested_message.add()
948 n.bb = i
949 self.assertEqual(4, m.repeated_nested_message.pop().bb)
950 self.assertEqual(0, m.repeated_nested_message.pop(0).bb)
951 self.assertEqual(2, m.repeated_nested_message.pop(1).bb)
952 self.assertEqual([1, 3], [n.bb for n in m.repeated_nested_message])
953
954
955# Class to test proto2-only features (required, extensions, etc.)
Tamir Duberstein9f42f5f2015-01-13 14:47:32 -0500956class Proto2Test(unittest.TestCase):
Jisi Liuada65562015-02-25 16:39:11 -0800957
958 def testFieldPresence(self):
959 message = unittest_pb2.TestAllTypes()
960
961 self.assertFalse(message.HasField("optional_int32"))
962 self.assertFalse(message.HasField("optional_bool"))
963 self.assertFalse(message.HasField("optional_nested_message"))
964
965 with self.assertRaises(ValueError):
966 message.HasField("field_doesnt_exist")
967
968 with self.assertRaises(ValueError):
969 message.HasField("repeated_int32")
970 with self.assertRaises(ValueError):
971 message.HasField("repeated_nested_message")
972
973 self.assertEqual(0, message.optional_int32)
974 self.assertEqual(False, message.optional_bool)
975 self.assertEqual(0, message.optional_nested_message.bb)
976
977 # Fields are set even when setting the values to default values.
978 message.optional_int32 = 0
979 message.optional_bool = False
980 message.optional_nested_message.bb = 0
981 self.assertTrue(message.HasField("optional_int32"))
982 self.assertTrue(message.HasField("optional_bool"))
983 self.assertTrue(message.HasField("optional_nested_message"))
984
985 # Set the fields to non-default values.
986 message.optional_int32 = 5
987 message.optional_bool = True
988 message.optional_nested_message.bb = 15
989
990 self.assertTrue(message.HasField("optional_int32"))
991 self.assertTrue(message.HasField("optional_bool"))
992 self.assertTrue(message.HasField("optional_nested_message"))
993
994 # Clearing the fields unsets them and resets their value to default.
995 message.ClearField("optional_int32")
996 message.ClearField("optional_bool")
997 message.ClearField("optional_nested_message")
998
999 self.assertFalse(message.HasField("optional_int32"))
1000 self.assertFalse(message.HasField("optional_bool"))
1001 self.assertFalse(message.HasField("optional_nested_message"))
1002 self.assertEqual(0, message.optional_int32)
1003 self.assertEqual(False, message.optional_bool)
1004 self.assertEqual(0, message.optional_nested_message.bb)
1005
1006 # TODO(tibell): The C++ implementations actually allows assignment
1007 # of unknown enum values to *scalar* fields (but not repeated
1008 # fields). Once checked enum fields becomes the default in the
1009 # Python implementation, the C++ implementation should follow suit.
1010 def testAssignInvalidEnum(self):
1011 """It should not be possible to assign an invalid enum number to an
1012 enum field."""
1013 m = unittest_pb2.TestAllTypes()
1014
1015 with self.assertRaises(ValueError) as _:
1016 m.optional_nested_enum = 1234567
1017 self.assertRaises(ValueError, m.repeated_nested_enum.append, 1234567)
1018
1019 def testGoldenExtensions(self):
1020 golden_data = test_util.GoldenFileData('golden_message')
1021 golden_message = unittest_pb2.TestAllExtensions()
1022 golden_message.ParseFromString(golden_data)
1023 all_set = unittest_pb2.TestAllExtensions()
1024 test_util.SetAllExtensions(all_set)
1025 self.assertEqual(all_set, golden_message)
1026 self.assertEqual(golden_data, golden_message.SerializeToString())
1027 golden_copy = copy.deepcopy(golden_message)
1028 self.assertEqual(golden_data, golden_copy.SerializeToString())
1029
1030 def testGoldenPackedExtensions(self):
1031 golden_data = test_util.GoldenFileData('golden_packed_fields_message')
1032 golden_message = unittest_pb2.TestPackedExtensions()
1033 golden_message.ParseFromString(golden_data)
1034 all_set = unittest_pb2.TestPackedExtensions()
1035 test_util.SetAllPackedExtensions(all_set)
1036 self.assertEqual(all_set, golden_message)
1037 self.assertEqual(golden_data, all_set.SerializeToString())
1038 golden_copy = copy.deepcopy(golden_message)
1039 self.assertEqual(golden_data, golden_copy.SerializeToString())
1040
1041 def testPickleIncompleteProto(self):
1042 golden_message = unittest_pb2.TestRequired(a=1)
1043 pickled_message = pickle.dumps(golden_message)
1044
1045 unpickled_message = pickle.loads(pickled_message)
1046 self.assertEqual(unpickled_message, golden_message)
1047 self.assertEqual(unpickled_message.a, 1)
1048 # This is still an incomplete proto - so serializing should fail
1049 self.assertRaises(message.EncodeError, unpickled_message.SerializeToString)
1050
Jisi Liu885b6122015-02-28 14:51:22 -08001051
Jisi Liuada65562015-02-25 16:39:11 -08001052 # TODO(haberman): this isn't really a proto2-specific test except that this
1053 # message has a required field in it. Should probably be factored out so
1054 # that we can test the other parts with proto3.
xiaofeng@google.comb55a20f2012-09-22 02:40:50 +00001055 def testParsingMerge(self):
1056 """Check the merge behavior when a required or optional field appears
1057 multiple times in the input."""
1058 messages = [
1059 unittest_pb2.TestAllTypes(),
1060 unittest_pb2.TestAllTypes(),
1061 unittest_pb2.TestAllTypes() ]
1062 messages[0].optional_int32 = 1
1063 messages[1].optional_int64 = 2
1064 messages[2].optional_int32 = 3
1065 messages[2].optional_string = 'hello'
1066
1067 merged_message = unittest_pb2.TestAllTypes()
1068 merged_message.optional_int32 = 3
1069 merged_message.optional_int64 = 2
1070 merged_message.optional_string = 'hello'
1071
1072 generator = unittest_pb2.TestParsingMerge.RepeatedFieldsGenerator()
1073 generator.field1.extend(messages)
1074 generator.field2.extend(messages)
1075 generator.field3.extend(messages)
1076 generator.ext1.extend(messages)
1077 generator.ext2.extend(messages)
1078 generator.group1.add().field1.MergeFrom(messages[0])
1079 generator.group1.add().field1.MergeFrom(messages[1])
1080 generator.group1.add().field1.MergeFrom(messages[2])
1081 generator.group2.add().field1.MergeFrom(messages[0])
1082 generator.group2.add().field1.MergeFrom(messages[1])
1083 generator.group2.add().field1.MergeFrom(messages[2])
1084
1085 data = generator.SerializeToString()
1086 parsing_merge = unittest_pb2.TestParsingMerge()
1087 parsing_merge.ParseFromString(data)
1088
1089 # Required and optional fields should be merged.
1090 self.assertEqual(parsing_merge.required_all_types, merged_message)
1091 self.assertEqual(parsing_merge.optional_all_types, merged_message)
1092 self.assertEqual(parsing_merge.optionalgroup.optional_group_all_types,
1093 merged_message)
1094 self.assertEqual(parsing_merge.Extensions[
1095 unittest_pb2.TestParsingMerge.optional_ext],
1096 merged_message)
1097
1098 # Repeated fields should not be merged.
1099 self.assertEqual(len(parsing_merge.repeated_all_types), 3)
1100 self.assertEqual(len(parsing_merge.repeatedgroup), 3)
1101 self.assertEqual(len(parsing_merge.Extensions[
1102 unittest_pb2.TestParsingMerge.repeated_ext]), 3)
1103
Bo Yang5db21732015-05-21 14:28:59 -07001104 def testPythonicInit(self):
1105 message = unittest_pb2.TestAllTypes(
1106 optional_int32=100,
1107 optional_fixed32=200,
1108 optional_float=300.5,
1109 optional_bytes=b'x',
1110 optionalgroup={'a': 400},
1111 optional_nested_message={'bb': 500},
1112 optional_nested_enum='BAZ',
1113 repeatedgroup=[{'a': 600},
1114 {'a': 700}],
1115 repeated_nested_enum=['FOO', unittest_pb2.TestAllTypes.BAR],
1116 default_int32=800,
1117 oneof_string='y')
Tamir Duberstein821fcb22015-08-12 14:22:25 -04001118 self.assertIsInstance(message, unittest_pb2.TestAllTypes)
Bo Yang5db21732015-05-21 14:28:59 -07001119 self.assertEqual(100, message.optional_int32)
1120 self.assertEqual(200, message.optional_fixed32)
1121 self.assertEqual(300.5, message.optional_float)
1122 self.assertEqual(b'x', message.optional_bytes)
1123 self.assertEqual(400, message.optionalgroup.a)
Tamir Duberstein821fcb22015-08-12 14:22:25 -04001124 self.assertIsInstance(message.optional_nested_message, unittest_pb2.TestAllTypes.NestedMessage)
Bo Yang5db21732015-05-21 14:28:59 -07001125 self.assertEqual(500, message.optional_nested_message.bb)
1126 self.assertEqual(unittest_pb2.TestAllTypes.BAZ,
1127 message.optional_nested_enum)
1128 self.assertEqual(2, len(message.repeatedgroup))
1129 self.assertEqual(600, message.repeatedgroup[0].a)
1130 self.assertEqual(700, message.repeatedgroup[1].a)
1131 self.assertEqual(2, len(message.repeated_nested_enum))
1132 self.assertEqual(unittest_pb2.TestAllTypes.FOO,
1133 message.repeated_nested_enum[0])
1134 self.assertEqual(unittest_pb2.TestAllTypes.BAR,
1135 message.repeated_nested_enum[1])
1136 self.assertEqual(800, message.default_int32)
1137 self.assertEqual('y', message.oneof_string)
1138 self.assertFalse(message.HasField('optional_int64'))
1139 self.assertEqual(0, len(message.repeated_float))
1140 self.assertEqual(42, message.default_int64)
1141
1142 message = unittest_pb2.TestAllTypes(optional_nested_enum=u'BAZ')
1143 self.assertEqual(unittest_pb2.TestAllTypes.BAZ,
1144 message.optional_nested_enum)
1145
1146 with self.assertRaises(ValueError):
1147 unittest_pb2.TestAllTypes(
1148 optional_nested_message={'INVALID_NESTED_FIELD': 17})
1149
1150 with self.assertRaises(TypeError):
1151 unittest_pb2.TestAllTypes(
1152 optional_nested_message={'bb': 'INVALID_VALUE_TYPE'})
1153
1154 with self.assertRaises(ValueError):
1155 unittest_pb2.TestAllTypes(optional_nested_enum='INVALID_LABEL')
1156
1157 with self.assertRaises(ValueError):
1158 unittest_pb2.TestAllTypes(repeated_nested_enum='FOO')
1159
jieluo@google.combde4a322014-08-12 21:10:30 +00001160
Jisi Liu3b3c8ab2016-03-30 11:39:59 -07001161
Jisi Liuada65562015-02-25 16:39:11 -08001162# Class to test proto3-only features/behavior (updated field presence & enums)
Tamir Duberstein9f42f5f2015-01-13 14:47:32 -05001163class Proto3Test(unittest.TestCase):
jieluo@google.combde4a322014-08-12 21:10:30 +00001164
Bo Yang5db21732015-05-21 14:28:59 -07001165 # Utility method for comparing equality with a map.
1166 def assertMapIterEquals(self, map_iter, dict_value):
1167 # Avoid mutating caller's copy.
1168 dict_value = dict(dict_value)
1169
1170 for k, v in map_iter:
1171 self.assertEqual(v, dict_value[k])
1172 del dict_value[k]
1173
1174 self.assertEqual({}, dict_value)
1175
Jisi Liuada65562015-02-25 16:39:11 -08001176 def testFieldPresence(self):
1177 message = unittest_proto3_arena_pb2.TestAllTypes()
jieluo@google.combde4a322014-08-12 21:10:30 +00001178
Jisi Liuada65562015-02-25 16:39:11 -08001179 # We can't test presence of non-repeated, non-submessage fields.
1180 with self.assertRaises(ValueError):
Bo Yang5db21732015-05-21 14:28:59 -07001181 message.HasField('optional_int32')
Jisi Liuada65562015-02-25 16:39:11 -08001182 with self.assertRaises(ValueError):
Bo Yang5db21732015-05-21 14:28:59 -07001183 message.HasField('optional_float')
Jisi Liuada65562015-02-25 16:39:11 -08001184 with self.assertRaises(ValueError):
Bo Yang5db21732015-05-21 14:28:59 -07001185 message.HasField('optional_string')
Jisi Liuada65562015-02-25 16:39:11 -08001186 with self.assertRaises(ValueError):
Bo Yang5db21732015-05-21 14:28:59 -07001187 message.HasField('optional_bool')
jieluo@google.combde4a322014-08-12 21:10:30 +00001188
Jisi Liuada65562015-02-25 16:39:11 -08001189 # But we can still test presence of submessage fields.
Bo Yang5db21732015-05-21 14:28:59 -07001190 self.assertFalse(message.HasField('optional_nested_message'))
jieluo@google.combde4a322014-08-12 21:10:30 +00001191
Jisi Liuada65562015-02-25 16:39:11 -08001192 # As with proto2, we can't test presence of fields that don't exist, or
1193 # repeated fields.
1194 with self.assertRaises(ValueError):
Bo Yang5db21732015-05-21 14:28:59 -07001195 message.HasField('field_doesnt_exist')
jieluo@google.combde4a322014-08-12 21:10:30 +00001196
Jisi Liuada65562015-02-25 16:39:11 -08001197 with self.assertRaises(ValueError):
Bo Yang5db21732015-05-21 14:28:59 -07001198 message.HasField('repeated_int32')
Jisi Liuada65562015-02-25 16:39:11 -08001199 with self.assertRaises(ValueError):
Bo Yang5db21732015-05-21 14:28:59 -07001200 message.HasField('repeated_nested_message')
jieluo@google.combde4a322014-08-12 21:10:30 +00001201
Jisi Liuada65562015-02-25 16:39:11 -08001202 # Fields should default to their type-specific default.
1203 self.assertEqual(0, message.optional_int32)
1204 self.assertEqual(0, message.optional_float)
Bo Yang5db21732015-05-21 14:28:59 -07001205 self.assertEqual('', message.optional_string)
Jisi Liuada65562015-02-25 16:39:11 -08001206 self.assertEqual(False, message.optional_bool)
1207 self.assertEqual(0, message.optional_nested_message.bb)
jieluo@google.combde4a322014-08-12 21:10:30 +00001208
Jisi Liuada65562015-02-25 16:39:11 -08001209 # Setting a submessage should still return proper presence information.
1210 message.optional_nested_message.bb = 0
Bo Yang5db21732015-05-21 14:28:59 -07001211 self.assertTrue(message.HasField('optional_nested_message'))
jieluo@google.combde4a322014-08-12 21:10:30 +00001212
Jisi Liuada65562015-02-25 16:39:11 -08001213 # Set the fields to non-default values.
1214 message.optional_int32 = 5
1215 message.optional_float = 1.1
Bo Yang5db21732015-05-21 14:28:59 -07001216 message.optional_string = 'abc'
Jisi Liuada65562015-02-25 16:39:11 -08001217 message.optional_bool = True
1218 message.optional_nested_message.bb = 15
jieluo@google.combde4a322014-08-12 21:10:30 +00001219
Jisi Liuada65562015-02-25 16:39:11 -08001220 # Clearing the fields unsets them and resets their value to default.
Bo Yang5db21732015-05-21 14:28:59 -07001221 message.ClearField('optional_int32')
1222 message.ClearField('optional_float')
1223 message.ClearField('optional_string')
1224 message.ClearField('optional_bool')
1225 message.ClearField('optional_nested_message')
jieluo@google.combde4a322014-08-12 21:10:30 +00001226
Jisi Liuada65562015-02-25 16:39:11 -08001227 self.assertEqual(0, message.optional_int32)
1228 self.assertEqual(0, message.optional_float)
Bo Yang5db21732015-05-21 14:28:59 -07001229 self.assertEqual('', message.optional_string)
Jisi Liuada65562015-02-25 16:39:11 -08001230 self.assertEqual(False, message.optional_bool)
1231 self.assertEqual(0, message.optional_nested_message.bb)
jieluo@google.combde4a322014-08-12 21:10:30 +00001232
Jisi Liuada65562015-02-25 16:39:11 -08001233 def testAssignUnknownEnum(self):
1234 """Assigning an unknown enum value is allowed and preserves the value."""
1235 m = unittest_proto3_arena_pb2.TestAllTypes()
jieluo@google.combde4a322014-08-12 21:10:30 +00001236
Jisi Liuada65562015-02-25 16:39:11 -08001237 m.optional_nested_enum = 1234567
1238 self.assertEqual(1234567, m.optional_nested_enum)
1239 m.repeated_nested_enum.append(22334455)
1240 self.assertEqual(22334455, m.repeated_nested_enum[0])
1241 # Assignment is a different code path than append for the C++ impl.
1242 m.repeated_nested_enum[0] = 7654321
1243 self.assertEqual(7654321, m.repeated_nested_enum[0])
1244 serialized = m.SerializeToString()
jieluo@google.combde4a322014-08-12 21:10:30 +00001245
Jisi Liuada65562015-02-25 16:39:11 -08001246 m2 = unittest_proto3_arena_pb2.TestAllTypes()
1247 m2.ParseFromString(serialized)
1248 self.assertEqual(1234567, m2.optional_nested_enum)
1249 self.assertEqual(7654321, m2.repeated_nested_enum[0])
jieluo@google.combde4a322014-08-12 21:10:30 +00001250
Bo Yang5db21732015-05-21 14:28:59 -07001251 # Map isn't really a proto3-only feature. But there is no proto2 equivalent
1252 # of google/protobuf/map_unittest.proto right now, so it's not easy to
1253 # test both with the same test like we do for the other proto2/proto3 tests.
1254 # (google/protobuf/map_protobuf_unittest.proto is very different in the set
1255 # of messages and fields it contains).
1256 def testScalarMapDefaults(self):
1257 msg = map_unittest_pb2.TestMap()
1258
1259 # Scalars start out unset.
1260 self.assertFalse(-123 in msg.map_int32_int32)
1261 self.assertFalse(-2**33 in msg.map_int64_int64)
1262 self.assertFalse(123 in msg.map_uint32_uint32)
1263 self.assertFalse(2**33 in msg.map_uint64_uint64)
1264 self.assertFalse('abc' in msg.map_string_string)
1265 self.assertFalse(888 in msg.map_int32_enum)
1266
1267 # Accessing an unset key returns the default.
1268 self.assertEqual(0, msg.map_int32_int32[-123])
1269 self.assertEqual(0, msg.map_int64_int64[-2**33])
1270 self.assertEqual(0, msg.map_uint32_uint32[123])
1271 self.assertEqual(0, msg.map_uint64_uint64[2**33])
1272 self.assertEqual('', msg.map_string_string['abc'])
1273 self.assertEqual(0, msg.map_int32_enum[888])
1274
1275 # It also sets the value in the map
1276 self.assertTrue(-123 in msg.map_int32_int32)
1277 self.assertTrue(-2**33 in msg.map_int64_int64)
1278 self.assertTrue(123 in msg.map_uint32_uint32)
1279 self.assertTrue(2**33 in msg.map_uint64_uint64)
1280 self.assertTrue('abc' in msg.map_string_string)
1281 self.assertTrue(888 in msg.map_int32_enum)
1282
Tamir Duberstein821fcb22015-08-12 14:22:25 -04001283 self.assertIsInstance(msg.map_string_string['abc'], six.text_type)
Bo Yang5db21732015-05-21 14:28:59 -07001284
Feng Xiaoe841bac2015-12-11 17:09:20 -08001285 # Accessing an unset key still throws TypeError if the type of the key
Bo Yang5db21732015-05-21 14:28:59 -07001286 # is incorrect.
1287 with self.assertRaises(TypeError):
1288 msg.map_string_string[123]
1289
Feng Xiaoe841bac2015-12-11 17:09:20 -08001290 with self.assertRaises(TypeError):
1291 123 in msg.map_string_string
Bo Yang5db21732015-05-21 14:28:59 -07001292
1293 def testMapGet(self):
1294 # Need to test that get() properly returns the default, even though the dict
1295 # has defaultdict-like semantics.
1296 msg = map_unittest_pb2.TestMap()
1297
1298 self.assertIsNone(msg.map_int32_int32.get(5))
Dan O'Reilly2621c8a2015-08-14 22:54:53 -04001299 self.assertEqual(10, msg.map_int32_int32.get(5, 10))
Bo Yang5db21732015-05-21 14:28:59 -07001300 self.assertIsNone(msg.map_int32_int32.get(5))
1301
1302 msg.map_int32_int32[5] = 15
Dan O'Reilly2621c8a2015-08-14 22:54:53 -04001303 self.assertEqual(15, msg.map_int32_int32.get(5))
Bo Yang5db21732015-05-21 14:28:59 -07001304
1305 self.assertIsNone(msg.map_int32_foreign_message.get(5))
Dan O'Reilly2621c8a2015-08-14 22:54:53 -04001306 self.assertEqual(10, msg.map_int32_foreign_message.get(5, 10))
Bo Yang5db21732015-05-21 14:28:59 -07001307
1308 submsg = msg.map_int32_foreign_message[5]
1309 self.assertIs(submsg, msg.map_int32_foreign_message.get(5))
1310
1311 def testScalarMap(self):
1312 msg = map_unittest_pb2.TestMap()
1313
1314 self.assertEqual(0, len(msg.map_int32_int32))
1315 self.assertFalse(5 in msg.map_int32_int32)
1316
1317 msg.map_int32_int32[-123] = -456
1318 msg.map_int64_int64[-2**33] = -2**34
1319 msg.map_uint32_uint32[123] = 456
1320 msg.map_uint64_uint64[2**33] = 2**34
1321 msg.map_string_string['abc'] = '123'
1322 msg.map_int32_enum[888] = 2
1323
1324 self.assertEqual([], msg.FindInitializationErrors())
1325
1326 self.assertEqual(1, len(msg.map_string_string))
1327
1328 # Bad key.
1329 with self.assertRaises(TypeError):
1330 msg.map_string_string[123] = '123'
1331
1332 # Verify that trying to assign a bad key doesn't actually add a member to
1333 # the map.
1334 self.assertEqual(1, len(msg.map_string_string))
1335
1336 # Bad value.
1337 with self.assertRaises(TypeError):
1338 msg.map_string_string['123'] = 123
1339
1340 serialized = msg.SerializeToString()
1341 msg2 = map_unittest_pb2.TestMap()
1342 msg2.ParseFromString(serialized)
1343
1344 # Bad key.
1345 with self.assertRaises(TypeError):
1346 msg2.map_string_string[123] = '123'
1347
1348 # Bad value.
1349 with self.assertRaises(TypeError):
1350 msg2.map_string_string['123'] = 123
1351
1352 self.assertEqual(-456, msg2.map_int32_int32[-123])
1353 self.assertEqual(-2**34, msg2.map_int64_int64[-2**33])
1354 self.assertEqual(456, msg2.map_uint32_uint32[123])
1355 self.assertEqual(2**34, msg2.map_uint64_uint64[2**33])
1356 self.assertEqual('123', msg2.map_string_string['abc'])
1357 self.assertEqual(2, msg2.map_int32_enum[888])
1358
1359 def testStringUnicodeConversionInMap(self):
1360 msg = map_unittest_pb2.TestMap()
1361
1362 unicode_obj = u'\u1234'
Tamir Duberstein821fcb22015-08-12 14:22:25 -04001363 bytes_obj = unicode_obj.encode('utf8')
Bo Yang5db21732015-05-21 14:28:59 -07001364
1365 msg.map_string_string[bytes_obj] = bytes_obj
1366
Dan O'Reilly3d5aa6a2015-08-14 16:12:34 -04001367 (key, value) = list(msg.map_string_string.items())[0]
Bo Yang5db21732015-05-21 14:28:59 -07001368
1369 self.assertEqual(key, unicode_obj)
1370 self.assertEqual(value, unicode_obj)
1371
Tamir Duberstein821fcb22015-08-12 14:22:25 -04001372 self.assertIsInstance(key, six.text_type)
1373 self.assertIsInstance(value, six.text_type)
Bo Yang5db21732015-05-21 14:28:59 -07001374
1375 def testMessageMap(self):
1376 msg = map_unittest_pb2.TestMap()
1377
1378 self.assertEqual(0, len(msg.map_int32_foreign_message))
1379 self.assertFalse(5 in msg.map_int32_foreign_message)
1380
1381 msg.map_int32_foreign_message[123]
1382 # get_or_create() is an alias for getitem.
1383 msg.map_int32_foreign_message.get_or_create(-456)
1384
1385 self.assertEqual(2, len(msg.map_int32_foreign_message))
1386 self.assertIn(123, msg.map_int32_foreign_message)
1387 self.assertIn(-456, msg.map_int32_foreign_message)
1388 self.assertEqual(2, len(msg.map_int32_foreign_message))
1389
1390 # Bad key.
1391 with self.assertRaises(TypeError):
1392 msg.map_int32_foreign_message['123']
1393
1394 # Can't assign directly to submessage.
1395 with self.assertRaises(ValueError):
1396 msg.map_int32_foreign_message[999] = msg.map_int32_foreign_message[123]
1397
1398 # Verify that trying to assign a bad key doesn't actually add a member to
1399 # the map.
1400 self.assertEqual(2, len(msg.map_int32_foreign_message))
1401
1402 serialized = msg.SerializeToString()
1403 msg2 = map_unittest_pb2.TestMap()
1404 msg2.ParseFromString(serialized)
1405
1406 self.assertEqual(2, len(msg2.map_int32_foreign_message))
1407 self.assertIn(123, msg2.map_int32_foreign_message)
1408 self.assertIn(-456, msg2.map_int32_foreign_message)
1409 self.assertEqual(2, len(msg2.map_int32_foreign_message))
1410
1411 def testMergeFrom(self):
1412 msg = map_unittest_pb2.TestMap()
1413 msg.map_int32_int32[12] = 34
1414 msg.map_int32_int32[56] = 78
1415 msg.map_int64_int64[22] = 33
1416 msg.map_int32_foreign_message[111].c = 5
1417 msg.map_int32_foreign_message[222].c = 10
1418
1419 msg2 = map_unittest_pb2.TestMap()
1420 msg2.map_int32_int32[12] = 55
1421 msg2.map_int64_int64[88] = 99
1422 msg2.map_int32_foreign_message[222].c = 15
1423
1424 msg2.MergeFrom(msg)
1425
1426 self.assertEqual(34, msg2.map_int32_int32[12])
1427 self.assertEqual(78, msg2.map_int32_int32[56])
1428 self.assertEqual(33, msg2.map_int64_int64[22])
1429 self.assertEqual(99, msg2.map_int64_int64[88])
1430 self.assertEqual(5, msg2.map_int32_foreign_message[111].c)
1431 self.assertEqual(10, msg2.map_int32_foreign_message[222].c)
1432
1433 # Verify that there is only one entry per key, even though the MergeFrom
1434 # may have internally created multiple entries for a single key in the
1435 # list representation.
1436 as_dict = {}
1437 for key in msg2.map_int32_foreign_message:
1438 self.assertFalse(key in as_dict)
1439 as_dict[key] = msg2.map_int32_foreign_message[key].c
1440
1441 self.assertEqual({111: 5, 222: 10}, as_dict)
1442
1443 # Special case: test that delete of item really removes the item, even if
1444 # there might have physically been duplicate keys due to the previous merge.
1445 # This is only a special case for the C++ implementation which stores the
1446 # map as an array.
1447 del msg2.map_int32_int32[12]
1448 self.assertFalse(12 in msg2.map_int32_int32)
1449
1450 del msg2.map_int32_foreign_message[222]
1451 self.assertFalse(222 in msg2.map_int32_foreign_message)
1452
Jisi Liu3b3c8ab2016-03-30 11:39:59 -07001453 def testMergeFromBadType(self):
1454 msg = map_unittest_pb2.TestMap()
1455 with self.assertRaisesRegexp(
1456 TypeError,
1457 r'Parameter to MergeFrom\(\) must be instance of same class: expected '
1458 r'.*TestMap got int\.'):
1459 msg.MergeFrom(1)
1460
1461 def testCopyFromBadType(self):
1462 msg = map_unittest_pb2.TestMap()
1463 with self.assertRaisesRegexp(
1464 TypeError,
1465 r'Parameter to [A-Za-z]*From\(\) must be instance of same class: '
1466 r'expected .*TestMap got int\.'):
1467 msg.CopyFrom(1)
1468
Bo Yang5db21732015-05-21 14:28:59 -07001469 def testIntegerMapWithLongs(self):
1470 msg = map_unittest_pb2.TestMap()
1471 msg.map_int32_int32[long(-123)] = long(-456)
1472 msg.map_int64_int64[long(-2**33)] = long(-2**34)
1473 msg.map_uint32_uint32[long(123)] = long(456)
1474 msg.map_uint64_uint64[long(2**33)] = long(2**34)
1475
1476 serialized = msg.SerializeToString()
1477 msg2 = map_unittest_pb2.TestMap()
1478 msg2.ParseFromString(serialized)
1479
1480 self.assertEqual(-456, msg2.map_int32_int32[-123])
1481 self.assertEqual(-2**34, msg2.map_int64_int64[-2**33])
1482 self.assertEqual(456, msg2.map_uint32_uint32[123])
1483 self.assertEqual(2**34, msg2.map_uint64_uint64[2**33])
1484
1485 def testMapAssignmentCausesPresence(self):
1486 msg = map_unittest_pb2.TestMapSubmessage()
1487 msg.test_map.map_int32_int32[123] = 456
1488
1489 serialized = msg.SerializeToString()
1490 msg2 = map_unittest_pb2.TestMapSubmessage()
1491 msg2.ParseFromString(serialized)
1492
1493 self.assertEqual(msg, msg2)
1494
1495 # Now test that various mutations of the map properly invalidate the
1496 # cached size of the submessage.
1497 msg.test_map.map_int32_int32[888] = 999
1498 serialized = msg.SerializeToString()
1499 msg2.ParseFromString(serialized)
1500 self.assertEqual(msg, msg2)
1501
1502 msg.test_map.map_int32_int32.clear()
1503 serialized = msg.SerializeToString()
1504 msg2.ParseFromString(serialized)
1505 self.assertEqual(msg, msg2)
1506
1507 def testMapAssignmentCausesPresenceForSubmessages(self):
1508 msg = map_unittest_pb2.TestMapSubmessage()
1509 msg.test_map.map_int32_foreign_message[123].c = 5
1510
1511 serialized = msg.SerializeToString()
1512 msg2 = map_unittest_pb2.TestMapSubmessage()
1513 msg2.ParseFromString(serialized)
1514
1515 self.assertEqual(msg, msg2)
1516
1517 # Now test that various mutations of the map properly invalidate the
1518 # cached size of the submessage.
1519 msg.test_map.map_int32_foreign_message[888].c = 7
1520 serialized = msg.SerializeToString()
1521 msg2.ParseFromString(serialized)
1522 self.assertEqual(msg, msg2)
1523
1524 msg.test_map.map_int32_foreign_message[888].MergeFrom(
1525 msg.test_map.map_int32_foreign_message[123])
1526 serialized = msg.SerializeToString()
1527 msg2.ParseFromString(serialized)
1528 self.assertEqual(msg, msg2)
1529
1530 msg.test_map.map_int32_foreign_message.clear()
1531 serialized = msg.SerializeToString()
1532 msg2.ParseFromString(serialized)
1533 self.assertEqual(msg, msg2)
1534
1535 def testModifyMapWhileIterating(self):
1536 msg = map_unittest_pb2.TestMap()
1537
1538 string_string_iter = iter(msg.map_string_string)
1539 int32_foreign_iter = iter(msg.map_int32_foreign_message)
1540
1541 msg.map_string_string['abc'] = '123'
1542 msg.map_int32_foreign_message[5].c = 5
1543
1544 with self.assertRaises(RuntimeError):
1545 for key in string_string_iter:
1546 pass
1547
1548 with self.assertRaises(RuntimeError):
1549 for key in int32_foreign_iter:
1550 pass
1551
1552 def testSubmessageMap(self):
1553 msg = map_unittest_pb2.TestMap()
1554
1555 submsg = msg.map_int32_foreign_message[111]
1556 self.assertIs(submsg, msg.map_int32_foreign_message[111])
Tamir Duberstein821fcb22015-08-12 14:22:25 -04001557 self.assertIsInstance(submsg, unittest_pb2.ForeignMessage)
Bo Yang5db21732015-05-21 14:28:59 -07001558
1559 submsg.c = 5
1560
1561 serialized = msg.SerializeToString()
1562 msg2 = map_unittest_pb2.TestMap()
1563 msg2.ParseFromString(serialized)
1564
1565 self.assertEqual(5, msg2.map_int32_foreign_message[111].c)
1566
1567 # Doesn't allow direct submessage assignment.
1568 with self.assertRaises(ValueError):
1569 msg.map_int32_foreign_message[88] = unittest_pb2.ForeignMessage()
1570
1571 def testMapIteration(self):
1572 msg = map_unittest_pb2.TestMap()
1573
Dan O'Reilly3d5aa6a2015-08-14 16:12:34 -04001574 for k, v in msg.map_int32_int32.items():
Bo Yang5db21732015-05-21 14:28:59 -07001575 # Should not be reached.
1576 self.assertTrue(False)
1577
1578 msg.map_int32_int32[2] = 4
1579 msg.map_int32_int32[3] = 6
1580 msg.map_int32_int32[4] = 8
1581 self.assertEqual(3, len(msg.map_int32_int32))
1582
1583 matching_dict = {2: 4, 3: 6, 4: 8}
Dan O'Reilly3d5aa6a2015-08-14 16:12:34 -04001584 self.assertMapIterEquals(msg.map_int32_int32.items(), matching_dict)
Bo Yang5db21732015-05-21 14:28:59 -07001585
1586 def testMapIterationClearMessage(self):
1587 # Iterator needs to work even if message and map are deleted.
1588 msg = map_unittest_pb2.TestMap()
1589
1590 msg.map_int32_int32[2] = 4
1591 msg.map_int32_int32[3] = 6
1592 msg.map_int32_int32[4] = 8
1593
Dan O'Reilly3d5aa6a2015-08-14 16:12:34 -04001594 it = msg.map_int32_int32.items()
Bo Yang5db21732015-05-21 14:28:59 -07001595 del msg
1596
1597 matching_dict = {2: 4, 3: 6, 4: 8}
1598 self.assertMapIterEquals(it, matching_dict)
1599
1600 def testMapConstruction(self):
1601 msg = map_unittest_pb2.TestMap(map_int32_int32={1: 2, 3: 4})
1602 self.assertEqual(2, msg.map_int32_int32[1])
1603 self.assertEqual(4, msg.map_int32_int32[3])
1604
1605 msg = map_unittest_pb2.TestMap(
1606 map_int32_foreign_message={3: unittest_pb2.ForeignMessage(c=5)})
1607 self.assertEqual(5, msg.map_int32_foreign_message[3].c)
1608
1609 def testMapValidAfterFieldCleared(self):
1610 # Map needs to work even if field is cleared.
1611 # For the C++ implementation this tests the correctness of
1612 # ScalarMapContainer::Release()
1613 msg = map_unittest_pb2.TestMap()
Feng Xiaoe841bac2015-12-11 17:09:20 -08001614 int32_map = msg.map_int32_int32
Bo Yang5db21732015-05-21 14:28:59 -07001615
Feng Xiaoe841bac2015-12-11 17:09:20 -08001616 int32_map[2] = 4
1617 int32_map[3] = 6
1618 int32_map[4] = 8
Bo Yang5db21732015-05-21 14:28:59 -07001619
1620 msg.ClearField('map_int32_int32')
Feng Xiaoe841bac2015-12-11 17:09:20 -08001621 self.assertEqual(b'', msg.SerializeToString())
Bo Yang5db21732015-05-21 14:28:59 -07001622 matching_dict = {2: 4, 3: 6, 4: 8}
Feng Xiaoe841bac2015-12-11 17:09:20 -08001623 self.assertMapIterEquals(int32_map.items(), matching_dict)
Bo Yang5db21732015-05-21 14:28:59 -07001624
Feng Xiaoe841bac2015-12-11 17:09:20 -08001625 def testMessageMapValidAfterFieldCleared(self):
1626 # Map needs to work even if field is cleared.
1627 # For the C++ implementation this tests the correctness of
1628 # ScalarMapContainer::Release()
1629 msg = map_unittest_pb2.TestMap()
1630 int32_foreign_message = msg.map_int32_foreign_message
1631
1632 int32_foreign_message[2].c = 5
1633
1634 msg.ClearField('map_int32_foreign_message')
1635 self.assertEqual(b'', msg.SerializeToString())
1636 self.assertTrue(2 in int32_foreign_message.keys())
1637
1638 def testMapIterInvalidatedByClearField(self):
1639 # Map iterator is invalidated when field is cleared.
1640 # But this case does need to not crash the interpreter.
Bo Yang5db21732015-05-21 14:28:59 -07001641 # For the C++ implementation this tests the correctness of
1642 # ScalarMapContainer::Release()
1643 msg = map_unittest_pb2.TestMap()
1644
Feng Xiaoe841bac2015-12-11 17:09:20 -08001645 it = iter(msg.map_int32_int32)
Bo Yang5db21732015-05-21 14:28:59 -07001646
1647 msg.ClearField('map_int32_int32')
Feng Xiaoe841bac2015-12-11 17:09:20 -08001648 with self.assertRaises(RuntimeError):
1649 for _ in it:
1650 pass
1651
1652 it = iter(msg.map_int32_foreign_message)
1653 msg.ClearField('map_int32_foreign_message')
1654 with self.assertRaises(RuntimeError):
1655 for _ in it:
1656 pass
Bo Yang5db21732015-05-21 14:28:59 -07001657
1658 def testMapDelete(self):
1659 msg = map_unittest_pb2.TestMap()
1660
1661 self.assertEqual(0, len(msg.map_int32_int32))
1662
1663 msg.map_int32_int32[4] = 6
1664 self.assertEqual(1, len(msg.map_int32_int32))
1665
1666 with self.assertRaises(KeyError):
1667 del msg.map_int32_int32[88]
1668
1669 del msg.map_int32_int32[4]
1670 self.assertEqual(0, len(msg.map_int32_int32))
1671
Feng Xiaoeee38b02015-08-22 18:25:48 -07001672 def testMapsAreMapping(self):
1673 msg = map_unittest_pb2.TestMap()
1674 self.assertIsInstance(msg.map_int32_int32, collections.Mapping)
1675 self.assertIsInstance(msg.map_int32_int32, collections.MutableMapping)
1676 self.assertIsInstance(msg.map_int32_foreign_message, collections.Mapping)
1677 self.assertIsInstance(msg.map_int32_foreign_message,
1678 collections.MutableMapping)
1679
1680 def testMapFindInitializationErrorsSmokeTest(self):
1681 msg = map_unittest_pb2.TestMap()
1682 msg.map_string_string['abc'] = '123'
1683 msg.map_int32_int32[35] = 64
1684 msg.map_string_foreign_message['foo'].c = 5
1685 self.assertEqual(0, len(msg.FindInitializationErrors()))
1686
Bo Yang5db21732015-05-21 14:28:59 -07001687
jieluo@google.combde4a322014-08-12 21:10:30 +00001688
Tamir Duberstein9f42f5f2015-01-13 14:47:32 -05001689class ValidTypeNamesTest(unittest.TestCase):
jieluo@google.combde4a322014-08-12 21:10:30 +00001690
1691 def assertImportFromName(self, msg, base_name):
1692 # Parse <type 'module.class_name'> to extra 'some.name' as a string.
1693 tp_name = str(type(msg)).split("'")[1]
1694 valid_names = ('Repeated%sContainer' % base_name,
1695 'Repeated%sFieldContainer' % base_name)
1696 self.assertTrue(any(tp_name.endswith(v) for v in valid_names),
1697 '%r does end with any of %r' % (tp_name, valid_names))
1698
1699 parts = tp_name.split('.')
1700 class_name = parts[-1]
1701 module_name = '.'.join(parts[:-1])
1702 __import__(module_name, fromlist=[class_name])
1703
1704 def testTypeNamesCanBeImported(self):
1705 # If import doesn't work, pickling won't work either.
1706 pb = unittest_pb2.TestAllTypes()
1707 self.assertImportFromName(pb.repeated_int32, 'Scalar')
1708 self.assertImportFromName(pb.repeated_nested_message, 'Composite')
1709
Feng Xiaoeee38b02015-08-22 18:25:48 -07001710class PackedFieldTest(unittest.TestCase):
1711
1712 def setMessage(self, message):
1713 message.repeated_int32.append(1)
1714 message.repeated_int64.append(1)
1715 message.repeated_uint32.append(1)
1716 message.repeated_uint64.append(1)
1717 message.repeated_sint32.append(1)
1718 message.repeated_sint64.append(1)
1719 message.repeated_fixed32.append(1)
1720 message.repeated_fixed64.append(1)
1721 message.repeated_sfixed32.append(1)
1722 message.repeated_sfixed64.append(1)
1723 message.repeated_float.append(1.0)
1724 message.repeated_double.append(1.0)
1725 message.repeated_bool.append(True)
1726 message.repeated_nested_enum.append(1)
1727
1728 def testPackedFields(self):
1729 message = packed_field_test_pb2.TestPackedTypes()
1730 self.setMessage(message)
1731 golden_data = (b'\x0A\x01\x01'
1732 b'\x12\x01\x01'
1733 b'\x1A\x01\x01'
1734 b'\x22\x01\x01'
1735 b'\x2A\x01\x02'
1736 b'\x32\x01\x02'
1737 b'\x3A\x04\x01\x00\x00\x00'
1738 b'\x42\x08\x01\x00\x00\x00\x00\x00\x00\x00'
1739 b'\x4A\x04\x01\x00\x00\x00'
1740 b'\x52\x08\x01\x00\x00\x00\x00\x00\x00\x00'
1741 b'\x5A\x04\x00\x00\x80\x3f'
1742 b'\x62\x08\x00\x00\x00\x00\x00\x00\xf0\x3f'
1743 b'\x6A\x01\x01'
1744 b'\x72\x01\x01')
1745 self.assertEqual(golden_data, message.SerializeToString())
1746
1747 def testUnpackedFields(self):
1748 message = packed_field_test_pb2.TestUnpackedTypes()
1749 self.setMessage(message)
1750 golden_data = (b'\x08\x01'
1751 b'\x10\x01'
1752 b'\x18\x01'
1753 b'\x20\x01'
1754 b'\x28\x02'
1755 b'\x30\x02'
1756 b'\x3D\x01\x00\x00\x00'
1757 b'\x41\x01\x00\x00\x00\x00\x00\x00\x00'
1758 b'\x4D\x01\x00\x00\x00'
1759 b'\x51\x01\x00\x00\x00\x00\x00\x00\x00'
1760 b'\x5D\x00\x00\x80\x3f'
1761 b'\x61\x00\x00\x00\x00\x00\x00\xf0\x3f'
1762 b'\x68\x01'
1763 b'\x70\x01')
1764 self.assertEqual(golden_data, message.SerializeToString())
kenton@google.com80b1d622009-07-29 01:13:20 +00001765
1766if __name__ == '__main__':
Tamir Duberstein9f42f5f2015-01-13 14:47:32 -05001767 unittest.main()