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 class TestGenmsgPy(unittest.TestCase):
49 
50  def test_PythonKeyword(self):
51  from test_rospy.msg import PythonKeyword
52  # the md5sum is pulled from the c++ message generator. The
53  # test here is that the Python msg generator didn't
54  # accidentally mutate a md5sum based on a message that has its
55  # fieldname remapped.
56  self.assertEquals(PythonKeyword._md5sum, "1330d6bbfad8e75334346fec949d5133")
57 
58  ## Utility for testing roundtrip serialization
59  ## @param orig Message to test roundtrip serialization of
60  ## @param blank Uninitialized instance of message to deserialize into
61  ## @param float bool: if True, use almostEquals instead of equals
62  ## comparison. This variant assumes only data field is named
63  ## 'data'
64  def _test_ser_deser(self, orig, blank, float=False):
65  b = StringIO()
66  orig.serialize(b)
67  blank.deserialize(b.getvalue())
68  if not float:
69  self.assertEquals(orig, blank, str(orig)+" != "+str(blank))
70  else:
71  self.assertAlmostEquals(orig.data, blank.data, 5)
72 
73  ## #2133/2152
75  from test_rospy.msg import TransitiveImport
76  m = TransitiveImport()
77  # invoking serialize should be enough to expose issue. The bug
78  # was that genmsg_py was failing to include the imports of
79  # embedded messages. Because messages are flattened, this
80  # causes ImportErrors.
81  self._test_ser_deser(m, TransitiveImport())
82 
84  from test_rospy.msg import TestFixedArray
85  m = TestFixedArray()
86  self.assertEquals([0.], m.f32_1)
87  self.assertEquals([0., 0., 0.], m.f32_3)
88  self.assertEquals([0.], m.f64_1)
89  self.assertEquals([0., 0., 0.], m.f64_3)
90  self.assertEquals([0], m.i8_1)
91  self.assertEquals([0, 0, 0], m.i8_3)
92  self.assertEquals(chr(0), m.u8_1)
93  self.assertEquals(chr(0)*3, m.u8_3)
94  self.assertEquals([0], m.i32_1)
95  self.assertEquals([0, 0, 0], m.i32_3)
96  self.assertEquals([0], m.u32_1)
97  self.assertEquals([0, 0, 0], m.u32_3)
98  self.assertEquals([''], m.s_1)
99  self.assertEquals(['', '', ''], m.s_3)
100 
101  self._test_ser_deser(m, TestFixedArray())
102 
103  m = TestFixedArray(i32_1 = [1])
104  c = TestFixedArray()
105  self._test_ser_deser(m, c)
106  self.assertEquals((1,), c.i32_1)
107 
108  m = TestFixedArray(i32_3 = [-3, 2, 10])
109  c = TestFixedArray()
110  self._test_ser_deser(m, c)
111  self.assertEquals((-3, 2, 10), c.i32_3)
112 
113  m = TestFixedArray(u32_1 = [1234])
114  c = TestFixedArray()
115  self._test_ser_deser(m, c)
116  self.assertEquals((1234,), c.u32_1)
117 
118  m = TestFixedArray(u32_3 = [3, 2, 10])
119  c = TestFixedArray()
120  self._test_ser_deser(m, c)
121  self.assertEquals((3, 2, 10), c.u32_3)
122 
123  # this could potentially fail due to floating point lossiness
124  m,c = TestFixedArray(f32_1 = [2.]), TestFixedArray()
125  self._test_ser_deser(m, c)
126  self.assertEquals((2.,), c.f32_1)
127 
128  m,c = TestFixedArray(f32_3 = [1., 2., 3.]), TestFixedArray()
129  self._test_ser_deser(m, c)
130  self.assertEquals((1., 2., 3.), c.f32_3)
131 
132  m,c = TestFixedArray(u8_1 = 'x'), TestFixedArray()
133  self._test_ser_deser(m, c)
134  self.assertEquals('x', c.u8_1)
135 
136  m,c = TestFixedArray(u8_3 = 'xyz'), TestFixedArray()
137  self._test_ser_deser(m, c)
138  self.assertEquals('xyz', c.u8_3)
139 
140  m,c = TestFixedArray(s_1 = ['']), TestFixedArray()
141  self._test_ser_deser(m, c)
142  self.assertEquals([''], c.s_1)
143 
144  m,c = TestFixedArray(s_1 = ['blah blah blah']), TestFixedArray()
145  self._test_ser_deser(m, c)
146  self.assertEquals(['blah blah blah',], c.s_1)
147 
148  m = TestFixedArray(s_3 = ['', 'x', 'xyz'])
149  c = TestFixedArray()
150  self._test_ser_deser(m, c)
151  self.assertEquals(['', 'x', 'xyz'], c.s_3)
152 
153  for v in [True, False]:
154  m = TestFixedArray(b_1 = [v])
155  c = TestFixedArray()
156  self._test_ser_deser(m, c)
157  self.assertEquals([v], c.b_1)
158 
159  m = TestFixedArray(b_3 = [True, False, True])
160  c = TestFixedArray()
161  self._test_ser_deser(m, c)
162  self.assertEquals([True, False, True], c.b_3)
163 
164  #TODO: enable tests for auto-convert of uint8[] to string
165 
167  from test_rospy.msg import TestConstants
168  self.assertEquals(-123.0, TestConstants.A)
169  self.assertEquals(124.0, TestConstants.B)
170  self.assertEquals(125.0, TestConstants.C)
171  self.assertEquals(123, TestConstants.X)
172  self.assertEquals(-123, TestConstants.Y)
173  self.assertEquals(124, TestConstants.Z)
174  self.assertEquals("'hi", TestConstants.SINGLEQUOTE)
175  self.assertEquals('"hello" there', TestConstants.DOUBLEQUOTE)
176  self.assertEquals('"hello" \'goodbye\'', TestConstants.MULTIQUOTE)
177  self.assertEquals('foo', TestConstants.FOO)
178  self.assertEquals('"#comments" are ignored, and leading and trailing whitespace removed',TestConstants.EXAMPLE)
179  self.assertEquals('strip', TestConstants.WHITESPACE)
180  self.assertEquals('', TestConstants.EMPTY)
181 
182  self.assertEquals(True, TestConstants.TRUE)
183  self.assertEquals(False, TestConstants.FALSE)
184 
186  from std_msgs.msg import Empty
187  self.assertEquals(Empty(), Empty())
188  self._test_ser_deser(Empty(), Empty())
189 
191  from std_msgs.msg import Bool
192  self.assertEquals(Bool(), Bool())
193  self._test_ser_deser(Bool(), Bool())
194  # default value should be False
195  self.assertEquals(False, Bool().data)
196  # test various constructor permutations
197  for v in [True, False]:
198  self.assertEquals(Bool(v), Bool(v))
199  self.assertEquals(Bool(v), Bool(data=v))
200  self.assertEquals(Bool(data=v), Bool(data=v))
201  self.assertNotEquals(Bool(True), Bool(False))
202 
203  self._test_ser_deser(Bool(True), Bool())
204  self._test_ser_deser(Bool(False), Bool())
205 
206  # validate type cast to bool
207  blank = Bool()
208  b = StringIO()
209  Bool(True).serialize(b)
210  blank.deserialize(b.getvalue())
211  self.assert_(blank.data)
212  self.assert_(type(blank.data) == bool)
213 
214  b = StringIO()
215  Bool(True).serialize(b)
216  blank.deserialize(b.getvalue())
217  self.assert_(blank.data)
218  self.assert_(type(blank.data) == bool)
219 
220 
222  from std_msgs.msg import String
223  self.assertEquals(String(), String())
224  self.assertEquals('', String().data)
225  # default value should be empty string
226  self.assertEquals(String(''), String())
227  self.assertEquals(String(''), String(''))
228  self.assertEquals(String('foo'), String('foo'))
229  self.assertEquals(String('foo'), String(data='foo'))
230  self.assertEquals(String(data='foo'), String(data='foo'))
231 
232  self.assertNotEquals(String('foo'), String('bar'))
233  self.assertNotEquals(String('foo'), String(data='bar'))
234  self.assertNotEquals(String(data='foo'), String(data='bar'))
235 
236  self._test_ser_deser(String(''), String())
237  self._test_ser_deser(String('a man a plan a canal panama'), String())
238 
240  from std_msgs.msg import Int8, Int16, Int32, Int64
241  for cls in [Int8, Int16, Int32, Int64]:
242  v = random.randint(1, 127)
243  self.assertEquals(cls(), cls())
244  self.assertEquals(0, cls().data)
245  self.assertEquals(cls(), cls(0))
246  self.assertEquals(cls(0), cls(0))
247  self.assertEquals(cls(v), cls(v))
248  self.assertEquals(cls(-v), cls(-v))
249  self.assertEquals(cls(v), cls(data=v))
250  self.assertEquals(cls(data=v), cls(data=v))
251 
252  self.assertNotEquals(cls(v), cls())
253  self.assertNotEquals(cls(data=v), cls(data=-v))
254  self.assertNotEquals(cls(data=v), cls(data=v-1))
255  self.assertNotEquals(cls(data=v), cls(v-1))
256  self.assertNotEquals(cls(v), cls(v-1))
257 
258  self._test_ser_deser(cls(), cls())
259  self._test_ser_deser(cls(0), cls())
260  self._test_ser_deser(cls(-v), cls())
261  self._test_ser_deser(cls(v), cls())
262 
263  # rospy currently does not spot negative overflow due to the fact that Python's struct doesn't either
264  widths = [(8, Int8), (16, Int16), (32, Int32), (64, Int64)]
265  for w, cls in widths:
266  maxp = long(math.pow(2, w-1)) - 1
267  maxn = -long(math.pow(2, w-1)) + 1
268  self._test_ser_deser(cls(maxp), cls())
269  self._test_ser_deser(cls(maxn), cls())
270  try:
271  cls(maxp+1)._check_types()
272  self.fail("check_types should have noted width error[%s]: %s, %s"%(w, maxp+1, cls.__name__))
273  except SerializationError: pass
274  try:
275  cls(maxn-1)._check_types()
276  self.fail("check_types should have noted width error[%s]: %s, %s"%(w, maxn-1, cls.__name__))
277  except SerializationError: pass
278 
280  from std_msgs.msg import UInt8, UInt16, UInt32, UInt64
281  for cls in [UInt8, UInt16, UInt32, UInt64]:
282  v = random.randint(1, 127)
283  self.assertEquals(cls(), cls())
284  self.assertEquals(0, cls().data)
285  self.assertEquals(cls(), cls(0))
286  self.assertEquals(cls(0), cls(0))
287  self.assertEquals(cls(v), cls(v))
288  self.assertEquals(cls(v), cls(data=v))
289  self.assertEquals(cls(data=v), cls(data=v))
290 
291  self.assertNotEquals(cls(v), cls())
292  self.assertNotEquals(cls(data=v), cls(data=-v))
293  self.assertNotEquals(cls(data=v), cls(data=v-1))
294  self.assertNotEquals(cls(data=v), cls(v-1))
295  self.assertNotEquals(cls(v), cls(v-1))
296 
297  self._test_ser_deser(cls(), cls())
298  self._test_ser_deser(cls(0), cls())
299  self._test_ser_deser(cls(v), cls())
300 
301  try:
302  cls(-1)._check_types()
303  self.fail("check_types should have noted sign error[%s]: %s"%(w, cls.__name__))
304  except SerializationError: pass
305 
306  # rospy currently does not spot negative overflow due to the fact that Python's struct doesn't either
307  widths = [(8, UInt8), (16, UInt16), (32, UInt32), (64, UInt64)]
308  for w, cls in widths:
309  maxp = long(math.pow(2, w)) - 1
310  self._test_ser_deser(cls(maxp), cls())
311  try:
312  cls(maxp+1)._check_types()
313  self.fail("check_types should have noted width error[%s]: %s, %s"%(w, maxp+1, cls.__name__))
314  except SerializationError: pass
315 
317  from std_msgs.msg import Float32, Float64
318  for cls in [Float32, Float64]:
319  self.assertEquals(cls(), cls())
320  self.assertEquals(0., cls().data)
321  self.assertEquals(cls(), cls(0.))
322  self.assertEquals(cls(0.), cls(0.))
323  self.assertEquals(cls(1.), cls(1.))
324  self.assertEquals(cls(1.), cls(data=1.))
325  self.assertEquals(cls(data=1.), cls(data=1.))
326  self.assertEquals(cls(math.pi), cls(math.pi))
327  self.assertEquals(cls(math.pi), cls(data=math.pi))
328  self.assertEquals(cls(data=math.pi), cls(data=math.pi))
329 
330  self.assertNotEquals(cls(1.), cls())
331  self.assertNotEquals(cls(math.pi), cls())
332  self.assertNotEquals(cls(data=math.pi), cls(data=-math.pi))
333  self.assertNotEquals(cls(data=math.pi), cls(data=math.pi-1))
334  self.assertNotEquals(cls(data=math.pi), cls(math.pi-1))
335  self.assertNotEquals(cls(math.pi), cls(math.pi-1))
336 
337  self._test_ser_deser(cls(), cls())
338  self._test_ser_deser(cls(0.), cls())
339  self._test_ser_deser(cls(1.), cls(), float=True)
340  self._test_ser_deser(cls(math.pi), cls(), float=True)
341 
343  # multiarray is good test of embed plus array type
344  from std_msgs.msg import Int32MultiArray, MultiArrayDimension, MultiArrayLayout, UInt8MultiArray
345 
346  dims = [MultiArrayDimension('foo', 1, 2), MultiArrayDimension('bar', 3, 4),\
347  MultiArrayDimension('foo2', 5, 6), MultiArrayDimension('bar2', 7, 8)]
348  for d in dims:
349  self.assertEquals(d, d)
350 
351  # there was a bug with UInt8 arrays, so this is a regression
352  # test. the buff was with the uint8[] type consistency
353  buff = StringIO()
354  self.assertEquals(UInt8MultiArray(),UInt8MultiArray())
355  self.assertEquals('',UInt8MultiArray().data)
356  UInt8MultiArray().serialize(buff)
357  self.assertEquals(UInt8MultiArray(layout=MultiArrayLayout()),UInt8MultiArray())
358  UInt8MultiArray(layout=MultiArrayLayout()).serialize(buff)
359  data = ''.join([chr(i) for i in range(0, 100)])
360  v = UInt8MultiArray(data=data)
361  self._test_ser_deser(UInt8MultiArray(data=data),UInt8MultiArray())
362 
363  self.assertEquals(Int32MultiArray(),Int32MultiArray())
364  self.assertEquals(Int32MultiArray(layout=MultiArrayLayout()),Int32MultiArray())
365  self.assertEquals(Int32MultiArray(layout=MultiArrayLayout(), data=[1, 2, 3]),Int32MultiArray(data=[1, 2, 3]))
366  self.assertEquals(Int32MultiArray(layout=MultiArrayLayout(), data=[1, 2, 3]),\
367  Int32MultiArray(layout=MultiArrayLayout(),data=[1, 2, 3]))
368  self.assertEquals(Int32MultiArray(layout=MultiArrayLayout(dim=[]), data=[1, 2, 3]),\
369  Int32MultiArray(layout=MultiArrayLayout(),data=[1, 2, 3]))
370  self.assertEquals(Int32MultiArray(layout=MultiArrayLayout([], 0), data=[1, 2, 3]),\
371  Int32MultiArray(layout=MultiArrayLayout(),data=[1, 2, 3]))
372  self.assertEquals(Int32MultiArray(layout=MultiArrayLayout(dim=[], data_offset=0), data=[1, 2, 3]),\
373  Int32MultiArray(layout=MultiArrayLayout(),data=[1, 2, 3]))
374  self.assertEquals(Int32MultiArray(layout=MultiArrayLayout(dim=dims, data_offset=0), data=[1, 2, 3]),\
375  Int32MultiArray(layout=MultiArrayLayout(dim=dims),data=[1, 2, 3]))
376  self.assertEquals(Int32MultiArray(layout=MultiArrayLayout(dims, 10), data=[1, 2, 3]),\
377  Int32MultiArray(layout=MultiArrayLayout(dim=dims,data_offset=10),data=[1, 2, 3]))
378 
379 
380  self.assertNotEquals(Int32MultiArray(data=[1, 2, 3]),Int32MultiArray(data=[4,5,6]))
381  self.assertNotEquals(Int32MultiArray(layout=MultiArrayLayout([], 1), data=[1, 2, 3]),\
382  Int32MultiArray(layout=MultiArrayLayout([], 0),data=[1, 2, 3]))
383  self.assertNotEquals(Int32MultiArray(layout=MultiArrayLayout([], 1), data=[1, 2, 3]),\
384  Int32MultiArray(layout=MultiArrayLayout(dim=[]),data=[1, 2, 3]))
385  self.assertNotEquals(Int32MultiArray(layout=MultiArrayLayout(dims, 10), data=[1, 2, 3]),\
386  Int32MultiArray(layout=MultiArrayLayout(dim=dims,data_offset=11),data=[1, 2, 3]))
387  self.assertNotEquals(Int32MultiArray(layout=MultiArrayLayout(dim=dims, data_offset=10), data=[1, 2, 3]),\
388  Int32MultiArray(layout=MultiArrayLayout(dim=dims[1:],data_offset=10),data=[1, 2, 3]))
389 
390 
391  self._test_ser_deser(Int32MultiArray(),Int32MultiArray())
392  self._test_ser_deser(Int32MultiArray(layout=MultiArrayLayout()),Int32MultiArray())
393  self._test_ser_deser(Int32MultiArray(data=[1, 2, 3]),Int32MultiArray())
def _test_ser_deser(self, orig, blank, float=False)
Utility for testing roundtrip serialization.
def test_test_rospy_TransitiveImport(self)
#2133/2152


test_rospy
Author(s): Ken Conley
autogenerated on Sun Feb 3 2019 03:30:22