From 9f845e6a62ddb706206c9d45751a3686ff077e5c Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Fri, 3 May 2019 11:29:20 -0700 Subject: [PATCH] Make qos event test resilient to unimplemented events Signed-off-by: Emerson Knapp --- rclpy/src/rclpy/_rclpy_qos_event.c | 15 ++++-- rclpy/test/test_qos_event.py | 84 +++++++++++++++++------------- 2 files changed, 59 insertions(+), 40 deletions(-) diff --git a/rclpy/src/rclpy/_rclpy_qos_event.c b/rclpy/src/rclpy/_rclpy_qos_event.c index 624246a1a..907be7e67 100644 --- a/rclpy/src/rclpy/_rclpy_qos_event.c +++ b/rclpy/src/rclpy/_rclpy_qos_event.c @@ -342,9 +342,16 @@ rclpy_take_event(PyObject * Py_UNUSED(self), PyObject * args) } ret = rcl_take_event(event, &event_data); - if (!_check_rcl_return(ret, "Failed to take event")) { - return NULL; + if (RCL_RET_UNSUPPORTED == ret) { + PyErr_Format(PyExc_NotImplementedError, + "Take event is not implemented in the current RMW implementation: %s", + rcl_get_error_string().str); + rcl_reset_error(); + } else if (RCL_RET_OK != ret) { + PyErr_Format(PyExc_RuntimeError, "Failed to take event: %s", rcl_get_error_string().str); + rcl_reset_error(); + } else { + return event_filler(&event_data); } - - return event_filler(&event_data); + return NULL; } diff --git a/rclpy/test/test_qos_event.py b/rclpy/test/test_qos_event.py index a9cc369d5..07e10cd93 100644 --- a/rclpy/test/test_qos_event.py +++ b/rclpy/test/test_qos_event.py @@ -155,23 +155,29 @@ def test_call_publisher_rclpy_event_apis(self): # Calling take data even though not ready should provide me an empty initialized message # Tests data conversion utilities in C side - with deadline_event_handle as event_capsule, publisher.handle as publisher_capsule: - event_data = _rclpy.rclpy_take_event( - event_capsule, - publisher_capsule, - QoSPublisherEventType.RCL_PUBLISHER_OFFERED_DEADLINE_MISSED) - self.assertIsInstance(event_data, QoSOfferedDeadlineMissedInfo) - self.assertEqual(event_data.total_count, 0) - self.assertEqual(event_data.total_count_change, 0) - - with liveliness_event_handle as event_capsule, publisher.handle as publisher_capsule: - event_data = _rclpy.rclpy_take_event( - event_capsule, - publisher_capsule, - QoSPublisherEventType.RCL_PUBLISHER_LIVELINESS_LOST) - self.assertIsInstance(event_data, QoSLivelinessLostInfo) - self.assertEqual(event_data.total_count, 0) - self.assertEqual(event_data.total_count_change, 0) + try: + with deadline_event_handle as event_capsule, publisher.handle as publisher_capsule: + event_data = _rclpy.rclpy_take_event( + event_capsule, + publisher_capsule, + QoSPublisherEventType.RCL_PUBLISHER_OFFERED_DEADLINE_MISSED) + self.assertIsInstance(event_data, QoSOfferedDeadlineMissedInfo) + self.assertEqual(event_data.total_count, 0) + self.assertEqual(event_data.total_count_change, 0) + except NotImplementedError: + pass + + try: + with liveliness_event_handle as event_capsule, publisher.handle as publisher_capsule: + event_data = _rclpy.rclpy_take_event( + event_capsule, + publisher_capsule, + QoSPublisherEventType.RCL_PUBLISHER_LIVELINESS_LOST) + self.assertIsInstance(event_data, QoSLivelinessLostInfo) + self.assertEqual(event_data.total_count, 0) + self.assertEqual(event_data.total_count_change, 0) + except NotImplementedError: + pass self.node.destroy_publisher(publisher) @@ -202,24 +208,30 @@ def test_call_subscription_rclpy_event_apis(self): # Calling take data even though not ready should provide me an empty initialized message # Tests data conversion utilities in C side - with deadline_event_handle as event_capsule, subscription.handle as parent_capsule: - event_data = _rclpy.rclpy_take_event( - event_capsule, - parent_capsule, - QoSSubscriptionEventType.RCL_SUBSCRIPTION_REQUESTED_DEADLINE_MISSED) - self.assertIsInstance(event_data, QoSRequestedDeadlineMissedInfo) - self.assertEqual(event_data.total_count, 0) - self.assertEqual(event_data.total_count_change, 0) - - with liveliness_event_handle as event_capsule, subscription.handle as parent_capsule: - event_data = _rclpy.rclpy_take_event( - event_capsule, - parent_capsule, - QoSSubscriptionEventType.RCL_SUBSCRIPTION_LIVELINESS_CHANGED) - self.assertIsInstance(event_data, QoSLivelinessChangedInfo) - self.assertEqual(event_data.alive_count, 0) - self.assertEqual(event_data.alive_count_change, 0) - self.assertEqual(event_data.not_alive_count, 0) - self.assertEqual(event_data.not_alive_count_change, 0) + try: + with deadline_event_handle as event_capsule, subscription.handle as parent_capsule: + event_data = _rclpy.rclpy_take_event( + event_capsule, + parent_capsule, + QoSSubscriptionEventType.RCL_SUBSCRIPTION_REQUESTED_DEADLINE_MISSED) + self.assertIsInstance(event_data, QoSRequestedDeadlineMissedInfo) + self.assertEqual(event_data.total_count, 0) + self.assertEqual(event_data.total_count_change, 0) + except NotImplementedError: + pass + + try: + with liveliness_event_handle as event_capsule, subscription.handle as parent_capsule: + event_data = _rclpy.rclpy_take_event( + event_capsule, + parent_capsule, + QoSSubscriptionEventType.RCL_SUBSCRIPTION_LIVELINESS_CHANGED) + self.assertIsInstance(event_data, QoSLivelinessChangedInfo) + self.assertEqual(event_data.alive_count, 0) + self.assertEqual(event_data.alive_count_change, 0) + self.assertEqual(event_data.not_alive_count, 0) + self.assertEqual(event_data.not_alive_count_change, 0) + except NotImplementedError: + pass self.node.destroy_subscription(subscription)