test_roslib_msgs.py
Go to the documentation of this file.
1 # Software License Agreement (BSD License)
2 #
3 # Copyright (c) 2009, Willow Garage, Inc.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 #
10 # * Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # * Redistributions in binary form must reproduce the above
13 # copyright notice, this list of conditions and the following
14 # disclaimer in the documentation and/or other materials provided
15 # with the distribution.
16 # * Neither the name of Willow Garage, Inc. nor the names of its
17 # contributors may be used to endorse or promote products derived
18 # from this software without specific prior written permission.
19 #
20 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 # POSSIBILITY OF SUCH DAMAGE.
32 
33 import os
34 import sys
35 import unittest
36 
37 import roslib
38 PKG='test_roslib_comm'
39 class MsgSpecTest(unittest.TestCase):
40 
41  def test_verbose(self):
42  import roslib.msgs
43  self.failIf(roslib.msgs.is_verbose())
44  roslib.msgs.set_verbose(True)
45  self.assert_(roslib.msgs.is_verbose())
46  roslib.msgs.set_verbose(False)
47  self.failIf(roslib.msgs.is_verbose())
48 
49  def test_base_msg_type(self):
50  import roslib.msgs
51  tests = [(None, None), ('String', 'String'), ('std_msgs/String', 'std_msgs/String'),
52  ('String[10]', 'String'), ('string[10]', 'string'), ('std_msgs/String[10]', 'std_msgs/String'),
53  ]
54  for val, res in tests:
55  self.assertEquals(res, roslib.msgs.base_msg_type(val))
56 
57  def test_resolve_type(self):
58  from roslib.msgs import resolve_type
59  for t in ['string', 'string[]', 'string[14]', 'int32', 'int32[]']:
60  bt = roslib.msgs.base_msg_type(t)
61  self.assertEquals(t, resolve_type(t, PKG))
62 
63  self.assertEquals('foo/string', resolve_type('foo/string', PKG))
64  self.assertEquals('std_msgs/Header', resolve_type('Header', 'roslib'))
65  self.assertEquals('std_msgs/Header', resolve_type('std_msgs/Header', 'roslib'))
66  self.assertEquals('std_msgs/Header', resolve_type('Header', 'stereo_msgs'))
67  self.assertEquals('std_msgs/String', resolve_type('String', 'std_msgs'))
68  self.assertEquals('std_msgs/String', resolve_type('std_msgs/String', 'std_msgs'))
69  self.assertEquals('std_msgs/String', resolve_type('std_msgs/String', PKG))
70  self.assertEquals('std_msgs/String[]', resolve_type('std_msgs/String[]', PKG))
71 
72  def test_parse_type(self):
73  tests = [
74  ('a', ('a', False, None)),
75  ('int8', ('int8', False, None)),
76  ('std_msgs/String', ('std_msgs/String', False, None)),
77  ('a[]', ('a', True, None)),
78  ('int8[]', ('int8', True, None)),
79  ('std_msgs/String[]', ('std_msgs/String', True, None)),
80  ('a[1]', ('a', True, 1)),
81  ('int8[1]', ('int8', True, 1)),
82  ('std_msgs/String[1]', ('std_msgs/String', True, 1)),
83  ('a[11]', ('a', True, 11)),
84  ('int8[11]', ('int8', True, 11)),
85  ('std_msgs/String[11]', ('std_msgs/String', True, 11)),
86  ]
87  for val, res in tests:
88  self.assertEquals(res, roslib.msgs.parse_type(val))
89 
90  fail = ['a[1][2]', 'a[][]', '', None, 'a[', 'a[[1]', 'a[1]]']
91  for f in fail:
92  try:
93  roslib.msgs.parse_type(f)
94  self.fail("should have failed on " +f)
95  except roslib.msgs.MsgSpecException: pass
96 
97  def test_Constant(self):
98  import random
99  import roslib.msgs
100  vals = [random.randint(0, 1000) for i in range(0, 3)]
101  type_, name, val = [str(x) for x in vals]
102  x = roslib.msgs.Constant(type_, name, val, str(val))
103  self.assertEquals(type_, x.type)
104  self.assertEquals(name, x.name)
105  self.assertEquals(val, x.val)
106  self.assertEquals(roslib.msgs.Constant(type_, name, val, str(val)), x)
107 
108  self.assertNotEquals(1, x)
109  self.assertNotEquals(roslib.msgs.Constant('baz', name, val, str(val)), x)
110  self.assertNotEquals(roslib.msgs.Constant(type_, 'foo', val, str(val)), x)
111  self.assertNotEquals(roslib.msgs.Constant(type_, name, 'foo', 'foo'), x)
112 
113  # tripwire
114  self.assert_(repr(x))
115  self.assert_(str(x))
116 
117  try:
118  roslib.msgs.Constant(None, name, val, str(val))
119  except: pass
120  try:
121  roslib.msgs.Constant(type_, None, val, str(val))
122  except: pass
123  try:
124  roslib.msgs.Constant(type_, name, None, 'None')
125  except: pass
126  try:
127  roslib.msgs.Constant(type_, name, val, None)
128  except: pass
129 
130  try:
131  x.foo = 'bar'
132  self.fail('Constant should not allow arbitrary attr assignment')
133  except: pass
134 
135  def test_MsgSpec(self):
136  def sub_test_MsgSpec(types, names, constants, text, has_header):
137  m = MsgSpec(types, names, constants, text)
138  self.assertEquals(m.types, types)
139  self.assertEquals(m.names, names)
140  self.assertEquals(m.text, text)
141  self.assertEquals(has_header, m.has_header())
142  self.assertEquals(m.constants, constants)
143  self.assertEquals(list(zip(types, names)), m.fields())
144  self.assertEquals(m, MsgSpec(types, names, constants, text))
145  return m
146 
147  from roslib.msgs import MsgSpec
148  # allow empty msg
149  empty = sub_test_MsgSpec([], [], [], '', False)
150  self.assertEquals([], empty.fields())
151 
152  # one-field
153  one_field = sub_test_MsgSpec(['int32'], ['x'], [], 'int32 x', False)
154  # make sure that equals tests every declared field
155  self.assertEquals(one_field, MsgSpec(['int32'], ['x'], [], 'int32 x'))
156  self.assertNotEquals(one_field, MsgSpec(['uint32'], ['x'], [], 'int32 x'))
157  self.assertNotEquals(one_field, MsgSpec(['int32'], ['y'], [], 'int32 x'))
158  self.assertNotEquals(one_field, MsgSpec(['int32'], ['x'], [], 'uint32 x'))
159  # test against __ne__ as well
160  self.assert_(one_field != MsgSpec(['int32'], ['x'], [], 'uint32 x'))
161  #test strify
162  self.assertEquals("int32 x", str(one_field).strip())
163 
164  # test variations of multiple fields and headers
165  two_fields = sub_test_MsgSpec(['int32', 'string'], ['x', 'str'], [], 'int32 x\nstring str', False)
166  one_header = sub_test_MsgSpec(['Header'], ['header'], [], 'Header header', True)
167  header_and_fields = sub_test_MsgSpec(['Header', 'int32', 'string'], ['header', 'x', 'str'], [], 'Header header\nint32 x\nstring str', True)
168  embed_types = sub_test_MsgSpec(['Header', 'std_msgs/Int32', 'string'], ['header', 'x', 'str'], [], 'Header header\nstd_msgs/Int32 x\nstring str', True)
169  #test strify
170  self.assertEquals("int32 x\nstring str", str(two_fields).strip())
171 
172  # types and names mismatch
173  try:
174  MsgSpec(['int32', 'int32'], ['intval'], [], 'int32 intval\int32 y')
175  self.fail("types and names must align")
176  except: pass
177 
178  # test (not) equals against non msgspec
179  self.failIf(one_field == 1)
180  self.assert_(one_field != 1)
181  #TODO: test flatten
182 
183  # test that repr doesn't throw an error
184  [repr(x) for x in [empty, one_field, one_header, two_fields, embed_types]]
185 
186  def test_init(self):
187  import roslib.msgs
188  roslib.msgs._initialized = False
189  roslib.msgs._init()
190  self.assert_(roslib.msgs._initialized)
191  # test repeated initialization
192  roslib.msgs._init()
193 
195  from roslib.msgs import _convert_val, MsgSpecException
196  self.assertEquals(0., _convert_val('float32', '0.0'))
197  self.assertEquals(0., _convert_val('float64', '0.0'))
198 
199  self.assertEquals('fo o', _convert_val('string', ' fo o '))
200 
201  self.assertEquals(1, _convert_val('byte', '1'))
202  self.assertEquals(1, _convert_val('char', '1'))
203  self.assertEquals(1, _convert_val('int8', '1'))
204  self.assertEquals(12, _convert_val('int16', '12'))
205  self.assertEquals(-13, _convert_val('int32', '-13'))
206  self.assertEquals(14, _convert_val('int64', '14'))
207  self.assertEquals(0, _convert_val('uint8', '0'))
208  self.assertEquals(18, _convert_val('uint16', '18'))
209  self.assertEquals(19, _convert_val('uint32', '19'))
210  self.assertEquals(20, _convert_val('uint64', '20'))
211 
212  width_fail = [('int8', '129'), ('uint8', '256'),
213  ('int16', '35536'), ('uint16', '-1'),('uint16', '65536'),
214  ('int32', '3000000000'),('int32', '-2700000000'),
215  ('uint32', '-1'),('uint32', '41000000000'),
216  ('uint64', '-1')]
217  for t, v in width_fail:
218  try:
219  _convert_val(t, v)
220  self.fail("should have failed width check: %s, %s"%(t, v))
221  except MsgSpecException: pass
222  type_fail = [('int32', 'f'), ('float32', 'baz')]
223  for t, v in type_fail:
224  try:
225  _convert_val(t, v)
226  self.fail("should have failed type check: %s, %s"%(t, v))
227  except ValueError: pass
228  try:
229  _convert_val('foo', '1')
230  self.fail("should have failed invalid type")
231  except MsgSpecException: pass
232 
233  def test_msg_file(self):
234  import roslib.msgs
235  f = roslib.msgs.msg_file('rosgraph_msgs', 'Log')
236  self.assert_(os.path.isfile(f))
237  self.assert_(f.endswith('rosgraph_msgs/msg/Log.msg'))
238 
239  # msg_file should return paths even for non-existent resources
240  f = roslib.msgs.msg_file('roslib', 'Fake')
241  self.failIf(os.path.isfile(f))
242  self.assert_(f.endswith('roslib/msg/Fake.msg'))
243 
245  import roslib.msgs
246  vals = [
247  #basic
248  'F', 'f', 'Foo', 'Foo1',
249  'std_msgs/String',
250  # arrays
251  'Foo[]', 'Foo[1]', 'Foo[10]',
252  ]
253  for v in vals:
254  self.assert_(roslib.msgs.is_valid_msg_type(v), "roslib.msgs.is_valid_msg_type should have returned True for '%s'"%v)
255 
256  # bad cases
257  vals = [None, '', '#', '%', 'Foo%', 'Woo Woo',
258  '/', '/String',
259  'Foo[f]', 'Foo[1d]', 'Foo[-1]', 'Foo[1:10]', 'Foo[', 'Foo]', 'Foo[]Bar']
260  for v in vals:
261  self.failIf(roslib.msgs.is_valid_msg_type(v), "roslib.msgs.is_valid_msg_type should have returned False for '%s'"%v)
262 
264  import roslib.msgs
265  valid = ['int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', \
266  'uint64', 'float32', 'float64', 'char', 'byte', 'string']
267  invalid = [
268  'std_msgs/String', '/', 'String',
269  'time', 'duration','header',
270  ]
271  for v in valid:
272  self.assert_(roslib.msgs.is_valid_constant_type(v), "roslib.msgs.is_valid_constant_type should have returned True for '%s'"%v)
273  for v in invalid:
274  self.failIf(roslib.msgs.is_valid_constant_type(v), "roslib.msgs.is_valid_constant_type should have returned False for '%s'"%v)
275 


test_roslib_comm
Author(s): Jeremy Leibs, Ken Conley, Dirk Thomas
autogenerated on Mon Nov 2 2020 03:52:23