Skip to content

Commit 7c5ecb9

Browse files
author
Kenji Miyake
committed
Add test_component_container.py
Signed-off-by: Kenji Miyake <[email protected]>
1 parent c7accb5 commit 7c5ecb9

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# Copyright 2019 Open Source Robotics Foundation, Inc.
2+
# Copyright 2020 Open Avatar Inc.
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
import asyncio
17+
import io
18+
import textwrap
19+
20+
import osrf_pycommon.process_utils
21+
from launch import LaunchService
22+
from launch.frontend import Parser
23+
from launch_ros.utilities import evaluate_parameters
24+
from launch.utilities import perform_substitutions
25+
26+
27+
def test_launch_component_container_yaml():
28+
yaml_file = textwrap.dedent(
29+
r"""
30+
launch:
31+
- node_container:
32+
pkg: rclcpp_components
33+
exec: component_container
34+
name: my_container
35+
namespace: ''
36+
args: 'test_args'
37+
composable_node:
38+
- pkg: composition
39+
plugin: composition::Talker
40+
name: talker
41+
namespace: test_namespace
42+
remap:
43+
- from: chatter
44+
to: /remap/chatter
45+
param:
46+
- name: use_sim_time
47+
value: true
48+
extra_arg:
49+
- name: use_intra_process_comms
50+
value: 'true'
51+
52+
- load_composable_node:
53+
target: my_container
54+
composable_node:
55+
- pkg: composition
56+
plugin: composition::Listener
57+
name: listener
58+
namespace: test_namespace
59+
remap:
60+
- from: chatter
61+
to: /remap/chatter
62+
param:
63+
- name: use_sim_time
64+
value: true
65+
extra_arg:
66+
- name: use_intra_process_comms
67+
value: 'true'
68+
"""
69+
)
70+
with io.StringIO(yaml_file) as f:
71+
check_launch_namespace(f)
72+
73+
74+
def test_launch_component_container_xml():
75+
xml_file = textwrap.dedent(
76+
r"""
77+
<launch>
78+
<node_container pkg="rclcpp_components" exec="component_container" name="my_container" namespace="" args="test_args">
79+
<composable_node pkg="composition" plugin="composition::Talker" name="talker" namespace="test_namespace">
80+
<remap from="chatter" to="/remap/chatter" />
81+
<param name="use_sim_time" value="true"/>
82+
<extra_arg name="use_intra_process_comms" value="true"/>
83+
</composable_node>
84+
</node_container>
85+
86+
<load_composable_node target="my_container">
87+
<composable_node pkg="composition" plugin="composition::Listener" name="listener" namespace="test_namespace">
88+
<remap from="chatter" to="/remap/chatter" />
89+
<param name="use_sim_time" value="true"/>
90+
<extra_arg name="use_intra_process_comms" value="true"/>
91+
</composable_node>
92+
</load_composable_node>
93+
</launch>
94+
"""
95+
)
96+
with io.StringIO(xml_file) as f:
97+
check_launch_namespace(f)
98+
99+
100+
def check_launch_namespace(file):
101+
root_entity, parser = Parser.load(file)
102+
ld = parser.parse_description(root_entity)
103+
ls = LaunchService()
104+
ls.include_launch_description(ld)
105+
106+
loop = osrf_pycommon.process_utils.get_loop()
107+
launch_task = loop.create_task(ls.run_async())
108+
109+
node_container, load_composable_node = ld.describe_sub_entities()
110+
talker = node_container._ComposableNodeContainer__composable_node_descriptions[0]
111+
listener = load_composable_node._LoadComposableNodes__composable_node_descriptions[0]
112+
113+
def perform(substitution):
114+
return perform_substitutions(ls.context, substitution)
115+
116+
# Check container params
117+
assert perform(node_container._Node__package) == 'rclcpp_components'
118+
assert perform(node_container._Node__node_executable) == 'component_container'
119+
assert perform(node_container._Node__node_name) == 'my_container'
120+
assert perform(node_container._Node__node_namespace) == ''
121+
assert perform(node_container._Node__arguments[0]) == 'test_args'
122+
123+
assert perform(load_composable_node._LoadComposableNodes__target_container) == 'my_container'
124+
125+
# Check node parameters
126+
talker_remappings = list(talker._ComposableNode__remappings)
127+
listener_remappings = list(listener._ComposableNode__remappings)
128+
129+
talker_params = evaluate_parameters(ls.context, talker._ComposableNode__parameters)
130+
listener_params = evaluate_parameters(ls.context, listener._ComposableNode__parameters)
131+
132+
talker_extra_args = evaluate_parameters(ls.context, talker._ComposableNode__extra_arguments)
133+
listener_extra_args = evaluate_parameters(
134+
ls.context, listener._ComposableNode__extra_arguments)
135+
136+
assert perform(talker._ComposableNode__package) == 'composition'
137+
assert perform(talker._ComposableNode__node_plugin) == 'composition::Talker'
138+
assert perform(talker._ComposableNode__node_name) == 'talker'
139+
assert perform(talker._ComposableNode__node_namespace) == 'test_namespace'
140+
assert (perform(talker_remappings[0][0]),
141+
perform(talker_remappings[0][1])) == ('chatter', '/remap/chatter')
142+
assert talker_params[0]['use_sim_time'] is True
143+
144+
assert perform(listener._ComposableNode__package) == 'composition'
145+
assert perform(listener._ComposableNode__node_plugin) == 'composition::Listener'
146+
assert perform(listener._ComposableNode__node_name) == 'listener'
147+
assert perform(listener._ComposableNode__node_namespace) == 'test_namespace'
148+
assert (perform(listener_remappings[0][0]),
149+
perform(listener_remappings[0][1])) == ('chatter', '/remap/chatter')
150+
assert listener_params[0]['use_sim_time'] is True
151+
152+
# Check extra arguments
153+
assert talker_extra_args[0]['use_intra_process_comms'] is True
154+
assert listener_extra_args[0]['use_intra_process_comms'] is True
155+
156+
timeout_sec = 5
157+
loop.run_until_complete(asyncio.sleep(timeout_sec))
158+
if not launch_task.done():
159+
loop.create_task(ls.shutdown())
160+
loop.run_until_complete(launch_task)
161+
assert 0 == launch_task.result()

0 commit comments

Comments
 (0)