From 112a729581ee4cf307a4b8449be0874cb18455eb Mon Sep 17 00:00:00 2001 From: Bartok Date: Sun, 26 Jul 2026 01:52:01 -0400 Subject: [PATCH 1/2] fix(ros2): reject non-positive NodeDiscovery period_sec --- .../rai/communication/ros2/context.py | 6 ++++- .../ros2/test_node_discovery_period.py | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/communication/ros2/test_node_discovery_period.py diff --git a/src/rai_core/rai/communication/ros2/context.py b/src/rai_core/rai/communication/ros2/context.py index 9d12fa5d9..21675bbcc 100644 --- a/src/rai_core/rai/communication/ros2/context.py +++ b/src/rai_core/rai/communication/ros2/context.py @@ -154,7 +154,11 @@ def __init__( period_sec: float = 0.5, setters: Optional[List[Callable]] = None, ) -> None: - self.period_sec = period_sec + if not isinstance(period_sec, (int, float)) or isinstance(period_sec, bool): + raise ValueError("period_sec must be a positive number") + if not (period_sec > 0) or period_sec != period_sec: # NaN check + raise ValueError("period_sec must be positive") + self.period_sec = float(period_sec) self.node = node self.topics_and_types: Dict[str, str] = dict() diff --git a/tests/communication/ros2/test_node_discovery_period.py b/tests/communication/ros2/test_node_discovery_period.py new file mode 100644 index 000000000..03f661d05 --- /dev/null +++ b/tests/communication/ros2/test_node_discovery_period.py @@ -0,0 +1,23 @@ +# Copyright (C) 2026 Robotec.AI +from unittest.mock import MagicMock + +import pytest + +from rai.communication.ros2.context import NodeDiscovery + + +def test_node_discovery_rejects_non_positive_period_sec(): + node = MagicMock() + with pytest.raises(ValueError, match="period_sec"): + NodeDiscovery(node, period_sec=0) + with pytest.raises(ValueError, match="period_sec"): + NodeDiscovery(node, period_sec=-1.0) + with pytest.raises(ValueError, match="period_sec"): + NodeDiscovery(node, period_sec=float("nan")) + + +def test_node_discovery_accepts_positive_period_sec(): + node = MagicMock() + d = NodeDiscovery(node, period_sec=0.25) + assert d.period_sec == 0.25 + node.create_timer.assert_called() From 5b9ca27aa419e151c95f9bc17dc9e379039b5857 Mon Sep 17 00:00:00 2001 From: Bartok Date: Sun, 26 Jul 2026 01:53:37 -0400 Subject: [PATCH 2/2] test: place NodeDiscovery period tests outside ros2 package import --- .../ros2 => communication_offline}/test_node_discovery_period.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{communication/ros2 => communication_offline}/test_node_discovery_period.py (100%) diff --git a/tests/communication/ros2/test_node_discovery_period.py b/tests/communication_offline/test_node_discovery_period.py similarity index 100% rename from tests/communication/ros2/test_node_discovery_period.py rename to tests/communication_offline/test_node_discovery_period.py