# Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License").
# You may not use this file except in compliance with the License.
# A copy of the License is located at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# or in the "license" file accompanying this file. This file is distributed
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language governing
# permissions and limitations under the License.
import unittest
import xml.etree.ElementTree as etree
from ros2_launch_file_migrator import LaunchFileMigrator
from ros2_launch_file_migrator.launch_actions.launch_action import LaunchAction
class TestLaunchFileMigrator(unittest.TestCase):
def test_convert_node_elem(self):
launch_file_xml = ("\n"
'\n'
'')
expected_action = LaunchAction("Node", {
"package": "'my_package'",
"node_executable": "'the_type'",
"node_name": "'the_node'",
"output": "'screen'"
})
migrator = LaunchFileMigrator()
xml_tree = etree.fromstring(launch_file_xml)
self.assertEqual(migrator.convert_node_elem(
xml_tree[0]), expected_action)
def test_convert_attribute_simple_string(self):
node_parameter = "my_node"
expected_result = "'my_node'"
migrator = LaunchFileMigrator()
self.assertEqual(
expected_result, migrator.convert_attribute(node_parameter))
def test_convert_attribute_string_with_apostraphe(self):
node_parameter = "This isn't a description"
expected_result = "\"This isn't a description\""
migrator = LaunchFileMigrator()
self.assertEqual(
expected_result, migrator.convert_attribute(node_parameter))
def test_convert_attribute_is_arg(self):
migrator = LaunchFileMigrator()
node_parameter = "$(arg node_name)"
expected_result = "launch.substitutions.LaunchConfiguration('node_name')"
self.assertEqual(
expected_result, migrator.convert_attribute(node_parameter))
def test_convert_attribute_is_find(self):
migrator = LaunchFileMigrator()
node_parameter = "$(find turtlebot3_navigation)/maps/map.yaml"
expected_result = "get_package_share_directory('turtlebot3_navigation') + '/maps/map.yaml'"
expected_include = "from ament_index_python.packages import get_package_share_directory"
self.assertEqual(
expected_result, migrator.convert_attribute(node_parameter))
self.assertTrue(expected_include in migrator.imports)
def test_convert_attribute_is_optenv(self):
migrator = LaunchFileMigrator()
node_parameter = "$(optenv LAUNCH_ID my_launch)"
expected_result = "os.environ.get('LAUNCH_ID', 'my_launch')"
self.assertEqual(
expected_result, migrator.convert_attribute(node_parameter))
def test_convert_attribute_is_env(self):
migrator = LaunchFileMigrator()
node_parameter = "$(env LAUNCH_ID)"
expected_result = "os.environ.get('LAUNCH_ID')"
self.assertEqual(
expected_result, migrator.convert_attribute(node_parameter))
def test_convert_attribute_required(self):
# Tests that the 'required' node parameter is converted correctly
launch_file_xml = ('\n'
'\n'
'')
expected_action = LaunchAction("Node", {
"package": "'my_package'",
"on_exit": "launch.actions.Shutdown()"
})
migrator = LaunchFileMigrator()
xml_tree = etree.fromstring(launch_file_xml)
converted_node = migrator.convert_node_elem(xml_tree[0])
self.assertEqual(converted_node, expected_action)
def test_convert_arg_elem_default(self):
# Tests that the 'default' arg attribute is turned into default_value in ROS2
launch_file_xml = ('\n'
'\n'
'')
expected_action = LaunchAction("DeclareLaunchArgument", {
"name": "'logger_node_name'",
"default_value": "'my_logger'"
})
migrator = LaunchFileMigrator()
xml_tree = etree.fromstring(launch_file_xml)
converted_node = migrator.convert_arg_elem(xml_tree[0])
self.assertEqual(converted_node, expected_action)
def test_convert_arg_elem_value(self):
# Tests that the 'value' arg attribute is turned into default_value in ROS2
launch_file_xml = ('\n'
'\n'
'')
expected_action = LaunchAction("DeclareLaunchArgument", {
"name": "'metrics_node_name'",
"default_value": "os.environ.get('METRICS_NODE_NAME', 'my_node')"
})
migrator = LaunchFileMigrator()
xml_tree = etree.fromstring(launch_file_xml)
converted_node = migrator.convert_arg_elem(xml_tree[0])
self.assertEqual(converted_node, expected_action)
def test_convert_rosparam_elem(self):
# Tests that rosparam's loading a file are converted into a file path for ROS2
# so that they can be added to a nodes param list
launch_file_xml = ('\n'
'\n'
'')
expected_parameters = [
"get_package_share_directory('book_world') + '/routes/route.yaml'"
]
migrator = LaunchFileMigrator()
xml_tree = etree.fromstring(launch_file_xml)
converted_parameters = migrator.convert_rosparam_elems(xml_tree)
self.assertEqual(converted_parameters, expected_parameters)
def test_convert_rosparam_elem_with_name(self):
# Tests that rosparam's with a namespace are skipped
launch_file_xml = ('\n'
'\n'
'')
expected_parameters = []
migrator = LaunchFileMigrator()
xml_tree = etree.fromstring(launch_file_xml)
converted_parameters = migrator.convert_rosparam_elems(xml_tree)
self.assertEqual(converted_parameters, expected_parameters)
def test_convert_rosparam_elem_with_ns(self):
# Tests that rosparam's with a namespace are skipped
launch_file_xml = ('\n'
'\n'
'')
expected_parameters = []
migrator = LaunchFileMigrator()
xml_tree = etree.fromstring(launch_file_xml)
converted_parameters = migrator.convert_rosparam_elems(xml_tree)
self.assertEqual(converted_parameters, expected_parameters)
if __name__ == "__main__":
unittest.main()