moveit2
The MoveIt Motion Planning Framework for ROS 2.
serialize_msg.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 # Software License Agreement (BSD License)
4 #
5 # Copyright (c) 2020, RWTH Aachen University
6 # All rights reserved.
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
10 # are met:
11 #
12 # * Redistributions of source code must retain the above copyright
13 # notice, this list of conditions and the following disclaimer.
14 # * Redistributions in binary form must reproduce the above
15 # copyright notice, this list of conditions and the following
16 # disclaimer in the documentation and/or other materials provided
17 # with the distribution.
18 # * Neither the name of RWTH Aachen University nor the names of its
19 # contributors may be used to endorse or promote products derived
20 # from this software without specific prior written permission.
21 #
22 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 # POSSIBILITY OF SUCH DAMAGE.
34 #
35 # Author: Bjarne von Horn
36 #
37 
38 from moveit_ros_planning_interface._moveit_planning_interface_test_serialize_msg_cpp_helper import (
39  ByteStringTestHelper,
40 )
41 from geometry_msgs.msg import Vector3
42 import unittest
43 
44 try:
45  # Try Python 2.7 behaviour first
46  from StringIO import StringIO
47 
48  py_version_maj = 2
49 except ImportError:
50  # Use Python 3.x behaviour as fallback and choose the non-unicode version
51  from io import BytesIO as StringIO
52 
53  py_version_maj = 3
54 
55 
56 class PythonMsgSerializeTest(unittest.TestCase):
57  def setUp(self):
58  self.helperhelper = ByteStringTestHelper()
59 
60  def test_EmbeddedZeros(self):
61  self.assertTrue(self.helperhelper.compareEmbeddedZeros(b"\xff\xef\x00\x10"))
62 
64  # ByteString(const char*) constructor
65  self.assertEqual(self.helperhelper.getBytesPChar(), b"abcdef")
66 
68  # ByteString(const std::string&) constructor
69  self.assertEqual(self.helperhelper.getBytesStdString(), b"\xff\xfe\x10\x00\x00")
70 
72  self.assertEqual(self.helperhelper.getDefaultBytes(), b"")
73 
74  def test_CxxTupleToPy(self):
75  # sending a tuple from C++ to Python
76  ans = self.helperhelper.getTuple()
77  self.assertIsInstance(ans, tuple)
78  self.assertEqual(len(ans), 1)
79  self.assertEqual(ans[0], b"abcdef")
80 
81  def test_PyTupleToCxx(self):
82  # sending a tuple from Python to C++
83  self.assertTrue(self.helperhelper.compareTuple((b"mno",)))
84 
85  def test_sendMessage(self):
86  tmp = StringIO()
87  Vector3(x=1.0, y=-2.0, z=0.25).serialize(tmp)
88  self.assertTrue(self.helperhelper.compareVector(tmp.getvalue()))
89 
91  tmp = Vector3()
92  tmp.deserialize(self.helperhelper.getVector())
93  self.assertEqual(tmp, Vector3(1.0, -2.0, 0.25))
94 
95  def test_rejectInt(self):
96  with self.assertRaisesRegexp(Exception, "Python argument types in"):
97  self.helperhelper.compareEmbeddedZeros(4711)
98 
100  with self.assertRaisesRegexp(Exception, "Python argument types in"):
101  self.helperhelper.compareEmbeddedZeros((4711,))
102 
104  with self.assertRaisesRegexp(Exception, "Python argument types in"):
105  self.helperhelper.compareEmbeddedZeros(u"kdasd") # fmt: skip
106 
107  @unittest.skipIf(py_version_maj == 2, "does not trigger with python 2.7")
109  with self.assertRaisesRegexp(
110  RuntimeError, "Underlying python object is not a Bytes/String instance"
111  ):
112  self.helperhelper.compareVectorTuple((u"kdasd",)) # fmt: skip
113 
114 
115 if __name__ == "__main__":
116  unittest.main()