def test_create_node_process(self): from roslaunch.core import Node, Machine, RLException from roslaunch.node_args import NodeParamsException from roslaunch.nodeprocess import create_node_process, LocalProcess # have to use real ROS configuration for these tests ros_root = os.environ['ROS_ROOT'] rpp = os.environ.get('ROS_PACKAGE_PATH', None) master_uri = 'http://masteruri:1234' m = Machine('name1', ros_root, rpp, '1.2.3.4') run_id = 'id' # test invalid params n = Node('not_a_real_package','not_a_node') n.machine = m n.name = 'foo' try: # should fail b/c node cannot be found create_node_process(run_id, n, master_uri) self.fail("should have failed") except NodeParamsException: pass # have to specify a real node n = Node('rospy','talker.py') n.machine = m try: # should fail b/c n.name is not set create_node_process(run_id, n, master_uri) self.fail("should have failed") except ValueError: pass # have to specify a real node n = Node('rospy','talker.py') n.machine = None n.name = 'talker' try: # should fail b/c n.machine is not set create_node_process(run_id, n, master_uri) self.fail("should have failed") except RLException: pass # basic integration test n.machine = m p = create_node_process(run_id, n, master_uri) self.assert_(isinstance(p, LocalProcess)) # repeat some setup_local_process_env tests d = p.env self.assertEquals(d['ROS_MASTER_URI'], master_uri) self.assertEquals(d['ROS_ROOT'], ros_root) self.assertEquals(d['PYTHONPATH'], os.environ['PYTHONPATH']) if rpp: self.assertEquals(d['ROS_PACKAGE_PATH'], rpp) for k in ['ROS_IP', 'ROS_NAMESPACE']: if k in d: self.fail('%s should not be set: %s'%(k,d[k])) # test package and name self.assertEquals(p.package, 'rospy') # - no 'correct' full answer here self.assert_(p.name.startswith('talker'), p.name) # test log_output n.output = 'log' self.assert_(create_node_process(run_id, n, master_uri).log_output) n.output = 'screen' self.failIf(create_node_process(run_id, n, master_uri).log_output) # test respawn n.respawn = True self.assert_(create_node_process(run_id, n, master_uri).respawn) n.respawn = False self.failIf(create_node_process(run_id, n, master_uri).respawn) # test cwd n.cwd = None self.assertEquals(create_node_process(run_id, n, master_uri).cwd, None) n.cwd = 'ros-root' self.assertEquals(create_node_process(run_id, n, master_uri).cwd, 'ros-root') n.cwd = 'node' self.assertEquals(create_node_process(run_id, n, master_uri).cwd, 'node') # test args # - simplest test (no args) n.args = '' p = create_node_process(run_id, n, master_uri) # - the first arg should be the path to the node executable rospack = rospkg.RosPack() cmd = roslib.packages.find_node('rospy', 'talker.py', rospack)[0] self.assertEquals(p.args[0], cmd) # - test basic args n.args = "arg1 arg2 arg3" p = create_node_process(run_id, n, master_uri) self.assertEquals(p.args[0], cmd) for a in "arg1 arg2 arg3".split(): self.assert_(a in p.args) # - test remap args n.remap_args = [('KEY1', 'VAL1'), ('KEY2', 'VAL2')] p = create_node_process(run_id, n, master_uri) self.assert_('KEY1:=VAL1' in p.args) self.assert_('KEY2:=VAL2' in p.args) # - test __name n = Node('rospy','talker.py') n.name = 'fooname' n.machine = m self.assert_('__name:=fooname' in create_node_process(run_id, n, master_uri).args) # - test substitution args os.environ['SUB_TEST'] = 'subtest' os.environ['SUB_TEST2'] = 'subtest2' n.args = 'foo $(env SUB_TEST) $(env SUB_TEST2)' p = create_node_process(run_id, n, master_uri) self.failIf('SUB_TEST' in p.args) self.assert_('foo' in p.args) self.assert_('subtest' in p.args) self.assert_('subtest2' in p.args)
def test_create_node_process(self): from roslaunch.core import Node, Machine, RLException from roslaunch.node_args import NodeParamsException from roslaunch.nodeprocess import create_node_process, LocalProcess # have to use real ROS configuration for these tests ros_root = os.environ['ROS_ROOT'] rpp = os.environ.get('ROS_PACKAGE_PATH', None) master_uri = 'http://masteruri:1234' m = Machine('name1', ros_root, rpp, '1.2.3.4') run_id = 'id' # test invalid params n = Node('not_a_real_package', 'not_a_node') n.machine = m n.name = 'foo' try: # should fail b/c node cannot be found create_node_process(run_id, n, master_uri) self.fail("should have failed") except NodeParamsException: pass # have to specify a real node n = Node('roslaunch', 'talker.py') n.machine = m try: # should fail b/c n.name is not set create_node_process(run_id, n, master_uri) self.fail("should have failed") except ValueError: pass # have to specify a real node n = Node('roslaunch', 'talker.py') n.machine = None n.name = 'talker' try: # should fail b/c n.machine is not set create_node_process(run_id, n, master_uri) self.fail("should have failed") except RLException: pass # basic integration test n.machine = m p = create_node_process(run_id, n, master_uri) self.assert_(isinstance(p, LocalProcess)) # repeat some setup_local_process_env tests d = p.env self.assertEquals(d['ROS_MASTER_URI'], master_uri) self.assertEquals(d['ROS_ROOT'], ros_root) self.assertEquals(d['PYTHONPATH'], os.environ['PYTHONPATH']) if rpp: self.assertEquals(d['ROS_PACKAGE_PATH'], rpp) for k in ['ROS_IP', 'ROS_NAMESPACE']: if k in d: self.fail('%s should not be set: %s' % (k, d[k])) # test package and name self.assertEquals(p.package, 'roslaunch') # - no 'correct' full answer here self.assert_(p.name.startswith('talker'), p.name) # test log_output n.output = 'log' self.assert_(create_node_process(run_id, n, master_uri).log_output) n.output = 'screen' self.failIf(create_node_process(run_id, n, master_uri).log_output) # test respawn n.respawn = True self.assert_(create_node_process(run_id, n, master_uri).respawn) n.respawn = False self.failIf(create_node_process(run_id, n, master_uri).respawn) # test cwd n.cwd = None self.assertEquals(create_node_process(run_id, n, master_uri).cwd, None) n.cwd = 'ros-root' self.assertEquals( create_node_process(run_id, n, master_uri).cwd, 'ros-root') n.cwd = 'node' self.assertEquals( create_node_process(run_id, n, master_uri).cwd, 'node') # sigint timeout self.assertEquals( create_node_process(run_id, n, master_uri).sigint_timeout, 15) self.assertEquals( create_node_process(run_id, n, master_uri, sigint_timeout=1).sigint_timeout, 1) self.assertRaises(RLException, create_node_process, run_id, n, master_uri, sigint_timeout=0) # sigterm timeout self.assertEquals( create_node_process(run_id, n, master_uri).sigterm_timeout, 2) self.assertEquals( create_node_process(run_id, n, master_uri, sigterm_timeout=1).sigterm_timeout, 1) self.assertRaises(RLException, create_node_process, run_id, n, master_uri, sigterm_timeout=0) # test args # - simplest test (no args) n.args = '' p = create_node_process(run_id, n, master_uri) # - the first arg should be the path to the node executable rospack = rospkg.RosPack() cmd = roslib.packages.find_node('roslaunch', 'talker.py', rospack)[0] self.assertEquals(p.args[0], cmd) # - test basic args n.args = "arg1 arg2 arg3" p = create_node_process(run_id, n, master_uri) self.assertEquals(p.args[0], cmd) for a in "arg1 arg2 arg3".split(): self.assert_(a in p.args) # - test remap args n.remap_args = [('KEY1', 'VAL1'), ('KEY2', 'VAL2')] p = create_node_process(run_id, n, master_uri) self.assert_('KEY1:=VAL1' in p.args) self.assert_('KEY2:=VAL2' in p.args) # - test __name n = Node('roslaunch', 'talker.py') n.name = 'fooname' n.machine = m self.assert_('__name:=fooname' in create_node_process( run_id, n, master_uri).args) # - test substitution args os.environ['SUB_TEST'] = 'subtest' os.environ['SUB_TEST2'] = 'subtest2' n.args = 'foo $(env SUB_TEST) $(env SUB_TEST2)' p = create_node_process(run_id, n, master_uri) self.failIf('SUB_TEST' in p.args) self.assert_('foo' in p.args) self.assert_('subtest' in p.args) self.assert_('subtest2' in p.args)