From e442ad2278687a2d5994e580309fe31a435b6421 Mon Sep 17 00:00:00 2001 From: Barry Xu Date: Tue, 15 Nov 2022 02:00:19 +0800 Subject: [PATCH] Deal with ParameterUninitializedException for parameter service (#1033) * Deal with ParameterUninitializedException for parameter service Signed-off-by: Barry Xu * Enable all tests in test_parameter_client.py Signed-off-by: Barry Xu * Get empty value for ParameterUninitializedException Signed-off-by: Barry Xu Signed-off-by: Barry Xu --- rclpy/CMakeLists.txt | 1 + rclpy/rclpy/parameter_service.py | 4 ++-- rclpy/test/test_parameter_client.py | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/rclpy/CMakeLists.txt b/rclpy/CMakeLists.txt index a9966c040..d95209be5 100644 --- a/rclpy/CMakeLists.txt +++ b/rclpy/CMakeLists.txt @@ -175,6 +175,7 @@ if(BUILD_TESTING) test/test_messages.py test/test_node.py test/test_parameter.py + test/test_parameter_client.py test/test_publisher.py test/test_qos.py test/test_qos_event.py diff --git a/rclpy/rclpy/parameter_service.py b/rclpy/rclpy/parameter_service.py index 41314aadd..111fb46ea 100644 --- a/rclpy/rclpy/parameter_service.py +++ b/rclpy/rclpy/parameter_service.py @@ -17,7 +17,7 @@ from rcl_interfaces.msg import SetParametersResult from rcl_interfaces.srv import DescribeParameters, GetParameters, GetParameterTypes from rcl_interfaces.srv import ListParameters, SetParameters, SetParametersAtomically -from rclpy.exceptions import ParameterNotDeclaredException +from rclpy.exceptions import ParameterNotDeclaredException, ParameterUninitializedException from rclpy.parameter import Parameter, PARAMETER_SEPARATOR_STRING from rclpy.qos import qos_profile_parameters from rclpy.validate_topic_name import TOPIC_SEPARATOR_STRING @@ -80,7 +80,7 @@ def _get_parameters_callback(self, request, response): for name in request.names: try: param = node.get_parameter(name) - except ParameterNotDeclaredException: + except (ParameterNotDeclaredException, ParameterUninitializedException): response.values = node.get_parameters([]) return response response.values.append(param.get_parameter_value()) diff --git a/rclpy/test/test_parameter_client.py b/rclpy/test/test_parameter_client.py index 7c4882fc7..1fa30ede2 100644 --- a/rclpy/test/test_parameter_client.py +++ b/rclpy/test/test_parameter_client.py @@ -170,3 +170,24 @@ def test_load_parameter_file_atomically(self): finally: if os.path.exists(f.name): os.unlink(f.name) + + def test_get_uninitialized_parameter(self): + self.target_node.declare_parameter('uninitialized_parameter', Parameter.Type.STRING) + + # The type in description should be STRING + future = self.client.describe_parameters(['uninitialized_parameter']) + self.executor.spin_until_future_complete(future) + results = future.result() + assert results is not None + assert len(results.descriptors) == 1 + assert results.descriptors[0].type == ParameterType.PARAMETER_STRING + assert results.descriptors[0].name == 'uninitialized_parameter' + + # The value should be empty + future = self.client.get_parameters(['uninitialized_parameter']) + self.executor.spin_until_future_complete(future) + results = future.result() + assert results is not None + assert results.values == [] + + self.target_node.undeclare_parameter('uninitialized_parameter')