test_genmsg_py.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 # Software License Agreement (BSD License)
3 #
4 # Copyright (c) 2008, Willow Garage, Inc.
5 # All rights reserved.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are 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
15 # disclaimer in the documentation and/or other materials provided
16 # with the distribution.
17 # * Neither the name of Willow Garage, Inc. nor the names of its
18 # contributors may be used to endorse or promote products derived
19 # from 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
24 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 # POSSIBILITY OF SUCH DAMAGE.
33 
34 import os
35 import sys
36 import struct
37 import unittest
38 try:
39  from cStringIO import StringIO
40 except ImportError:
41  from io import BytesIO as StringIO
42 import time
43 import random
44 import math
45 
46 from roslib.message import SerializationError
47 
48 try:
49  long
50 except NameError:
51  long = int
52 
53 
54 class TestGenmsgPy(unittest.TestCase):
55 
56  def test_PythonKeyword(self):
57  from test_rospy.msg import PythonKeyword
58  # the md5sum is pulled from the c++ message generator. The
59  # test here is that the Python msg generator didn't
60  # accidentally mutate a md5sum based on a message that has its
61  # fieldname remapped.
62  self.assertEqual(PythonKeyword._md5sum, "1330d6bbfad8e75334346fec949d5133")
63 
64 
70  def _test_ser_deser(self, orig, blank, float=False):
71  b = StringIO()
72  orig.serialize(b)
73  blank.deserialize(b.getvalue())
74  if not float:
75  self.assertEqual(orig, blank, str(orig)+" != "+str(blank))
76  else:
77  self.assertAlmostEqual(orig.data, blank.data, 5)
78 
79 
81  from test_rospy.msg import TransitiveImport
82  m = TransitiveImport()
83  # invoking serialize should be enough to expose issue. The bug
84  # was that genmsg_py was failing to include the imports of
85  # embedded messages. Because messages are flattened, this
86  # causes ImportErrors.
87  self._test_ser_deser(m, TransitiveImport())
88 
90  from test_rospy.msg import TestFixedArray
91  m = TestFixedArray()
92  self.assertEqual([0.], m.f32_1)
93  self.assertEqual([0., 0., 0.], m.f32_3)
94  self.assertEqual([0.], m.f64_1)
95  self.assertEqual([0., 0., 0.], m.f64_3)
96  self.assertEqual([0], m.i8_1)
97  self.assertEqual([0, 0, 0], m.i8_3)
98  self.assertEqual(chr(0).encode(), m.u8_1)
99  self.assertEqual((chr(0)*3).encode(), m.u8_3)
100  self.assertEqual([0], m.i32_1)
101  self.assertEqual([0, 0, 0], m.i32_3)
102  self.assertEqual([0], m.u32_1)
103  self.assertEqual([0, 0, 0], m.u32_3)
104  self.assertEqual([''], m.s_1)
105  self.assertEqual(['', '', ''], m.s_3)
106 
107  self._test_ser_deser(m, TestFixedArray())
108 
109  m = TestFixedArray(i32_1 = [1])
110  c = TestFixedArray()
111  self._test_ser_deser(m, c)
112  self.assertEqual((1,), c.i32_1)
113 
114  m = TestFixedArray(i32_3 = [-3, 2, 10])
115  c = TestFixedArray()
116  self._test_ser_deser(m, c)
117  self.assertEqual((-3, 2, 10), c.i32_3)
118 
119  m = TestFixedArray(u32_1 = [1234])
120  c = TestFixedArray()
121  self._test_ser_deser(m, c)
122  self.assertEqual((1234,), c.u32_1)
123 
124  m = TestFixedArray(u32_3 = [3, 2, 10])
125  c = TestFixedArray()
126  self._test_ser_deser(m, c)
127  self.assertEqual((3, 2, 10), c.u32_3)
128 
129  # this could potentially fail due to floating point lossiness
130  m,c = TestFixedArray(f32_1 = [2.]), TestFixedArray()
131  self._test_ser_deser(m, c)
132  self.assertEqual((2.,), c.f32_1)
133 
134  m,c = TestFixedArray(f32_3 = [1., 2., 3.]), TestFixedArray()
135  self._test_ser_deser(m, c)
136  self.assertEqual((1., 2., 3.), c.f32_3)
137 
138  m,c = TestFixedArray(u8_1 = b'x'), TestFixedArray()
139  self._test_ser_deser(m, c)
140  self.assertEqual(b'x', c.u8_1)
141 
142  m,c = TestFixedArray(u8_3 = b'xyz'), TestFixedArray()
143  self._test_ser_deser(m, c)
144  self.assertEqual(b'xyz', c.u8_3)
145 
146  m,c = TestFixedArray(s_1 = ['']), TestFixedArray()
147  self._test_ser_deser(m, c)
148  self.assertEqual([''], c.s_1)
149 
150  m,c = TestFixedArray(s_1 = ['blah blah blah']), TestFixedArray()
151  self._test_ser_deser(m, c)
152  self.assertEqual(['blah blah blah',], c.s_1)
153 
154  m = TestFixedArray(s_3 = ['', 'x', 'xyz'])
155  c = TestFixedArray()
156  self._test_ser_deser(m, c)
157  self.assertEqual(['', 'x', 'xyz'], c.s_3)
158 
159  for v in [True, False]:
160  m = TestFixedArray(b_1 = [v])
161  c = TestFixedArray()
162  self._test_ser_deser(m, c)
163  self.assertEqual([v], c.b_1)
164 
165  m = TestFixedArray(b_3 = [True, False, True])
166  c = TestFixedArray()
167  self._test_ser_deser(m, c)
168  self.assertEqual([True, False, True], c.b_3)
169 
170  #TODO: enable tests for auto-convert of uint8[] to string
171 
173  from test_rospy.msg import TestConstants
174  self.assertEqual(-123.0, TestConstants.A)
175  self.assertEqual(124.0, TestConstants.B)
176  self.assertEqual(125.0, TestConstants.C)
177  self.assertEqual(123, TestConstants.X)
178  self.assertEqual(-123, TestConstants.Y)
179  self.assertEqual(124, TestConstants.Z)
180  self.assertEqual("'hi", TestConstants.SINGLEQUOTE)
181  self.assertEqual('"hello" there', TestConstants.DOUBLEQUOTE)
182  self.assertEqual('"hello" \'goodbye\'', TestConstants.MULTIQUOTE)
183  self.assertEqual('foo', TestConstants.FOO)
184  self.assertEqual('"#comments" are ignored, and leading and trailing whitespace removed',TestConstants.EXAMPLE)
185  self.assertEqual('strip', TestConstants.WHITESPACE)
186  self.assertEqual('', TestConstants.EMPTY)
187 
188  self.assertEqual(True, TestConstants.TRUE)
189  self.assertEqual(False, TestConstants.FALSE)
190 
192  from std_msgs.msg import Empty
193  self.assertEqual(Empty(), Empty())
194  self._test_ser_deser(Empty(), Empty())
195 
197  from std_msgs.msg import Bool
198  self.assertEqual(Bool(), Bool())
199  self._test_ser_deser(Bool(), Bool())
200  # default value should be False
201  self.assertEqual(False, Bool().data)
202  # test various constructor permutations
203  for v in [True, False]:
204  self.assertEqual(Bool(v), Bool(v))
205  self.assertEqual(Bool(v), Bool(data=v))
206  self.assertEqual(Bool(data=v), Bool(data=v))
207  self.assertNotEqual(Bool(True), Bool(False))
208 
209  self._test_ser_deser(Bool(True), Bool())
210  self._test_ser_deser(Bool(False), Bool())
211 
212  # validate type cast to bool
213  blank = Bool()
214  b = StringIO()
215  Bool(True).serialize(b)
216  blank.deserialize(b.getvalue())
217  self.assertTrue(blank.data)
218  self.assertTrue(type(blank.data) == bool)
219 
220  b = StringIO()
221  Bool(True).serialize(b)
222  blank.deserialize(b.getvalue())
223  self.assertTrue(blank.data)
224  self.assertTrue(type(blank.data) == bool)
225 
226 
228  from std_msgs.msg import String
229  self.assertEqual(String(), String())
230  self.assertEqual('', String().data)
231  # default value should be empty string
232  self.assertEqual(String(''), String())
233  self.assertEqual(String(''), String(''))
234  self.assertEqual(String('foo'), String('foo'))
235  self.assertEqual(String('foo'), String(data='foo'))
236  self.assertEqual(String(data='foo'), String(data='foo'))
237 
238  self.assertNotEqual(String('foo'), String('bar'))
239  self.assertNotEqual(String('foo'), String(data='bar'))
240  self.assertNotEqual(String(data='foo'), String(data='bar'))
241 
242  self._test_ser_deser(String(''), String())
243  self._test_ser_deser(String('a man a plan a canal panama'), String())
244 
246  from std_msgs.msg import Int8, Int16, Int32, Int64
247  for cls in [Int8, Int16, Int32, Int64]:
248  v = random.randint(1, 127)
249  self.assertEqual(cls(), cls())
250  self.assertEqual(0, cls().data)
251  self.assertEqual(cls(), cls(0))
252  self.assertEqual(cls(0), cls(0))
253  self.assertEqual(cls(v), cls(v))
254  self.assertEqual(cls(-v), cls(-v))
255  self.assertEqual(cls(v), cls(data=v))
256  self.assertEqual(cls(data=v), cls(data=v))
257 
258  self.assertNotEqual(cls(v), cls())
259  self.assertNotEqual(cls(data=v), cls(data=-v))
260  self.assertNotEqual(cls(data=v), cls(data=v-1))
261  self.assertNotEqual(cls(data=v), cls(v-1))
262  self.assertNotEqual(cls(v), cls(v-1))
263 
264  self._test_ser_deser(cls(), cls())
265  self._test_ser_deser(cls(0), cls())
266  self._test_ser_deser(cls(-v), cls())
267  self._test_ser_deser(cls(v), cls())
268 
269  # rospy currently does not spot negative overflow due to the fact that Python's struct doesn't either
270  widths = [(8, Int8), (16, Int16), (32, Int32), (64, Int64)]
271  for w, cls in widths:
272  maxp = long(math.pow(2, w-1)) - 1
273  maxn = -long(math.pow(2, w-1))
274  self._test_ser_deser(cls(maxp), cls())
275  self._test_ser_deser(cls(maxn), cls())
276  try:
277  cls(maxp+1)._check_types()
278  self.fail("check_types should have noted width error[%s]: %s, %s"%(w, maxp+1, cls.__name__))
279  except SerializationError: pass
280  try:
281  cls(maxn-1)._check_types()
282  self.fail("check_types should have noted width error[%s]: %s, %s"%(w, maxn-1, cls.__name__))
283  except SerializationError: pass
284 
286  from std_msgs.msg import UInt8, UInt16, UInt32, UInt64
287  for cls in [UInt8, UInt16, UInt32, UInt64]:
288  v = random.randint(1, 127)
289  self.assertEqual(cls(), cls())
290  self.assertEqual(0, cls().data)
291  self.assertEqual(cls(), cls(0))
292  self.assertEqual(cls(0), cls(0))
293  self.assertEqual(cls(v), cls(v))
294  self.assertEqual(cls(v), cls(data=v))
295  self.assertEqual(cls(data=v), cls(data=v))
296 
297  self.assertNotEqual(cls(v), cls())
298  self.assertNotEqual(cls(data=v), cls(data=-v))
299  self.assertNotEqual(cls(data=v), cls(data=v-1))
300  self.assertNotEqual(cls(data=v), cls(v-1))
301  self.assertNotEqual(cls(v), cls(v-1))
302 
303  self._test_ser_deser(cls(), cls())
304  self._test_ser_deser(cls(0), cls())
305  self._test_ser_deser(cls(v), cls())
306 
307  try:
308  cls(-1)._check_types()
309  self.fail("check_types should have noted sign error[%s]: %s"%(w, cls.__name__))
310  except SerializationError: pass
311 
312  # rospy currently does not spot negative overflow due to the fact that Python's struct doesn't either
313  widths = [(8, UInt8), (16, UInt16), (32, UInt32), (64, UInt64)]
314  for w, cls in widths:
315  maxp = long(math.pow(2, w)) - 1
316  self._test_ser_deser(cls(maxp), cls())
317  try:
318  cls(maxp+1)._check_types()
319  self.fail("check_types should have noted width error[%s]: %s, %s"%(w, maxp+1, cls.__name__))
320  except SerializationError: pass
321 
323  from std_msgs.msg import Float32, Float64
324  for cls in [Float32, Float64]:
325  self.assertEqual(cls(), cls())
326  self.assertEqual(0., cls().data)
327  self.assertEqual(cls(), cls(0.))
328  self.assertEqual(cls(0.), cls(0.))
329  self.assertEqual(cls(1.), cls(1.))
330  self.assertEqual(cls(1.), cls(data=1.))
331  self.assertEqual(cls(data=1.), cls(data=1.))
332  self.assertEqual(cls(math.pi), cls(math.pi))
333  self.assertEqual(cls(math.pi), cls(data=math.pi))
334  self.assertEqual(cls(data=math.pi), cls(data=math.pi))
335 
336  self.assertNotEqual(cls(1.), cls())
337  self.assertNotEqual(cls(math.pi), cls())
338  self.assertNotEqual(cls(data=math.pi), cls(data=-math.pi))
339  self.assertNotEqual(cls(data=math.pi), cls(data=math.pi-1))
340  self.assertNotEqual(cls(data=math.pi), cls(math.pi-1))
341  self.assertNotEqual(cls(math.pi), cls(math.pi-1))
342 
343  self._test_ser_deser(cls(), cls())
344  self._test_ser_deser(cls(0.), cls())
345  self._test_ser_deser(cls(1.), cls(), float=True)
346  self._test_ser_deser(cls(math.pi), cls(), float=True)
347 
349  # multiarray is good test of embed plus array type
350  from std_msgs.msg import Int32MultiArray, MultiArrayDimension, MultiArrayLayout, UInt8MultiArray
351 
352  dims = [MultiArrayDimension('foo', 1, 2), MultiArrayDimension('bar', 3, 4),\
353  MultiArrayDimension('foo2', 5, 6), MultiArrayDimension('bar2', 7, 8)]
354  for d in dims:
355  self.assertEqual(d, d)
356 
357  # there was a bug with UInt8 arrays, so this is a regression
358  # test. the buff was with the uint8[] type consistency
359  buff = StringIO()
360  self.assertEqual(UInt8MultiArray(),UInt8MultiArray())
361  self.assertEqual(b'', UInt8MultiArray().data)
362  UInt8MultiArray().serialize(buff)
363  self.assertEqual(UInt8MultiArray(layout=MultiArrayLayout()),UInt8MultiArray())
364  UInt8MultiArray(layout=MultiArrayLayout()).serialize(buff)
365  data = ''.join([chr(i) for i in range(0, 100)])
366  v = UInt8MultiArray(data=data)
367  self._test_ser_deser(UInt8MultiArray(data=data.encode()),UInt8MultiArray())
368 
369  self.assertEqual(Int32MultiArray(),Int32MultiArray())
370  self.assertEqual(Int32MultiArray(layout=MultiArrayLayout()),Int32MultiArray())
371  self.assertEqual(Int32MultiArray(layout=MultiArrayLayout(), data=[1, 2, 3]),Int32MultiArray(data=[1, 2, 3]))
372  self.assertEqual(Int32MultiArray(layout=MultiArrayLayout(), data=[1, 2, 3]),\
373  Int32MultiArray(layout=MultiArrayLayout(),data=[1, 2, 3]))
374  self.assertEqual(Int32MultiArray(layout=MultiArrayLayout(dim=[]), data=[1, 2, 3]),\
375  Int32MultiArray(layout=MultiArrayLayout(),data=[1, 2, 3]))
376  self.assertEqual(Int32MultiArray(layout=MultiArrayLayout([], 0), data=[1, 2, 3]),\
377  Int32MultiArray(layout=MultiArrayLayout(),data=[1, 2, 3]))
378  self.assertEqual(Int32MultiArray(layout=MultiArrayLayout(dim=[], data_offset=0), data=[1, 2, 3]),\
379  Int32MultiArray(layout=MultiArrayLayout(),data=[1, 2, 3]))
380  self.assertEqual(Int32MultiArray(layout=MultiArrayLayout(dim=dims, data_offset=0), data=[1, 2, 3]),\
381  Int32MultiArray(layout=MultiArrayLayout(dim=dims),data=[1, 2, 3]))
382  self.assertEqual(Int32MultiArray(layout=MultiArrayLayout(dims, 10), data=[1, 2, 3]),\
383  Int32MultiArray(layout=MultiArrayLayout(dim=dims,data_offset=10),data=[1, 2, 3]))
384 
385 
386  self.assertNotEqual(Int32MultiArray(data=[1, 2, 3]),Int32MultiArray(data=[4,5,6]))
387  self.assertNotEqual(Int32MultiArray(layout=MultiArrayLayout([], 1), data=[1, 2, 3]),\
388  Int32MultiArray(layout=MultiArrayLayout([], 0),data=[1, 2, 3]))
389  self.assertNotEqual(Int32MultiArray(layout=MultiArrayLayout([], 1), data=[1, 2, 3]),\
390  Int32MultiArray(layout=MultiArrayLayout(dim=[]),data=[1, 2, 3]))
391  self.assertNotEqual(Int32MultiArray(layout=MultiArrayLayout(dims, 10), data=[1, 2, 3]),\
392  Int32MultiArray(layout=MultiArrayLayout(dim=dims,data_offset=11),data=[1, 2, 3]))
393  self.assertNotEqual(Int32MultiArray(layout=MultiArrayLayout(dim=dims, data_offset=10), data=[1, 2, 3]),\
394  Int32MultiArray(layout=MultiArrayLayout(dim=dims[1:],data_offset=10),data=[1, 2, 3]))
395 
396 
397  self._test_ser_deser(Int32MultiArray(),Int32MultiArray())
398  self._test_ser_deser(Int32MultiArray(layout=MultiArrayLayout()),Int32MultiArray())
399  self._test_ser_deser(Int32MultiArray(data=[1, 2, 3]),Int32MultiArray())
msg
unit.test_genmsg_py.TestGenmsgPy.test_std_msgs_SignedInt
def test_std_msgs_SignedInt(self)
Definition: test_genmsg_py.py:245
unit.test_genmsg_py.long
long
Definition: test_genmsg_py.py:51
unit.test_genmsg_py.TestGenmsgPy.test_std_msgs_MultiArray
def test_std_msgs_MultiArray(self)
Definition: test_genmsg_py.py:348
unit.test_genmsg_py.TestGenmsgPy._test_ser_deser
def _test_ser_deser(self, orig, blank, float=False)
Utility for testing roundtrip serialization.
Definition: test_genmsg_py.py:70
unit.test_genmsg_py.TestGenmsgPy
Definition: test_genmsg_py.py:54
unit.test_genmsg_py.TestGenmsgPy.test_std_msgs_UnsignedInt
def test_std_msgs_UnsignedInt(self)
Definition: test_genmsg_py.py:285
unit.test_genmsg_py.TestGenmsgPy.test_std_msgs_String
def test_std_msgs_String(self)
Definition: test_genmsg_py.py:227
unit.test_genmsg_py.TestGenmsgPy.test_test_rospy_TestConstants
def test_test_rospy_TestConstants(self)
Definition: test_genmsg_py.py:172
unit.test_genmsg_py.TestGenmsgPy.test_std_msgs_Bool
def test_std_msgs_Bool(self)
Definition: test_genmsg_py.py:196
unit.test_genmsg_py.TestGenmsgPy.test_test_rospy_TransitiveImport
def test_test_rospy_TransitiveImport(self)
#2133/2152
Definition: test_genmsg_py.py:80
unit.test_genmsg_py.TestGenmsgPy.test_test_rospy_TestFixedArray
def test_test_rospy_TestFixedArray(self)
Definition: test_genmsg_py.py:89
unit.test_genmsg_py.TestGenmsgPy.test_std_msgs_Float
def test_std_msgs_Float(self)
Definition: test_genmsg_py.py:322
unit.test_genmsg_py.TestGenmsgPy.test_std_msgs_empty
def test_std_msgs_empty(self)
Definition: test_genmsg_py.py:191
unit.test_genmsg_py.TestGenmsgPy.test_PythonKeyword
def test_PythonKeyword(self)
Definition: test_genmsg_py.py:56


test_rospy
Author(s): Ken Conley, Dirk Thomas , Jacob Perron
autogenerated on Tue May 20 2025 03:00:44