Skip to content

Commit 34c259f

Browse files
committed
Add call service timeout tests to rosbridge_library
1 parent a045876 commit 34c259f

File tree

2 files changed

+110
-18
lines changed

2 files changed

+110
-18
lines changed

rosbridge_library/test/capabilities/test_call_service.py

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ def trigger_cb(self, request, response):
2424
response.message = "called trigger service successfully"
2525
return response
2626

27+
def trigger_long_cb(self, request, response):
28+
"""Helper callback function for a long running test service with no arguments."""
29+
time.sleep(0.5)
30+
response.success = True
31+
response.message = "called trigger service successfully"
32+
return response
33+
2734
def set_bool_cb(self, request, response):
2835
"""Helper callback function for a test service with arguments."""
2936
response.success = request.data
@@ -51,6 +58,12 @@ def setUp(self):
5158
self.trigger_cb,
5259
callback_group=self.cb_group,
5360
)
61+
self.trigger_long_srv = self.node.create_service(
62+
Trigger,
63+
self.node.get_name() + "/trigger_long",
64+
self.trigger_long_cb,
65+
callback_group=self.cb_group,
66+
)
5467
self.set_bool_srv = self.node.create_service(
5568
SetBool,
5669
self.node.get_name() + "/set_bool",
@@ -63,8 +76,9 @@ def setUp(self):
6376

6477
def tearDown(self):
6578
self.executor.remove_node(self.node)
66-
self.node.destroy_node()
6779
self.executor.shutdown()
80+
self.exec_thread.join()
81+
self.node.destroy_node()
6882
rclpy.shutdown()
6983

7084
def test_missing_arguments(self):
@@ -99,12 +113,6 @@ def cb(msg, cid=None, compression="none"):
99113

100114
s.call_service(send_msg)
101115

102-
timeout = 1.0
103-
start = time.time()
104-
while time.time() - start < timeout:
105-
if received["arrived"]:
106-
break
107-
108116
self.assertTrue(received["arrived"])
109117
values = received["msg"]["values"]
110118
self.assertEqual(values["success"], True)
@@ -136,12 +144,6 @@ def cb(msg, cid=None, compression="none"):
136144

137145
s.call_service(send_msg)
138146

139-
timeout = 1.0
140-
start = time.time()
141-
while time.time() - start < timeout:
142-
if received["arrived"]:
143-
break
144-
145147
self.assertTrue(received["arrived"])
146148
values = received["msg"]["values"]
147149
self.assertEqual(values["success"], True)
@@ -175,11 +177,45 @@ def cb(msg, cid=None, compression="none"):
175177

176178
s.call_service(send_msg)
177179

178-
timeout = 1.0
179-
start = time.time()
180-
while time.time() - start < timeout:
181-
if received["arrived"]:
182-
break
180+
self.assertTrue(received["arrived"])
181+
self.assertFalse(received["msg"]["result"])
182+
183+
def test_call_service_timeout(self):
184+
185+
client = self.node.create_client(Trigger, self.trigger_long_srv.srv_name)
186+
assert client.wait_for_service(1.0)
187+
188+
proto = Protocol("test_call_service_timeout", self.node)
189+
s = CallService(proto)
190+
send_msg = loads(
191+
dumps({"op": "call_service", "service": self.trigger_long_srv.srv_name, "timeout": 2.0})
192+
)
193+
194+
received = {"msg": None, "arrived": False}
195+
196+
def cb(msg, cid=None, compression="none"):
197+
print("Received message")
198+
received["msg"] = msg
199+
received["arrived"] = True
200+
201+
proto.send = cb
202+
203+
s.call_service(send_msg)
204+
205+
self.assertTrue(received["arrived"])
206+
self.assertTrue(received["msg"]["result"])
207+
values = received["msg"]["values"]
208+
self.assertEqual(values["success"], True)
209+
self.assertEqual(values["message"], "called trigger service successfully")
210+
211+
send_msg = loads(
212+
dumps({"op": "call_service", "service": self.trigger_long_srv.srv_name, "timeout": 0.1})
213+
)
214+
received = {"msg": None, "arrived": False}
215+
216+
s.call_service(send_msg)
183217

184218
self.assertTrue(received["arrived"])
185219
self.assertFalse(received["msg"]["result"])
220+
values = received["msg"]["values"]
221+
self.assertEqual(values, "Timeout exceeded while waiting for service response")

rosbridge_library/test/capabilities/test_service_capabilities.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,62 @@ def test_call_advertised_service(self):
150150
self.assertEqual(self.received_message["op"], "service_response")
151151
self.assertTrue(self.received_message["result"])
152152

153+
def test_call_advertised_service_with_timeout(self):
154+
# Advertise the service
155+
service_path = "/set_bool_3"
156+
advertise_msg = loads(
157+
dumps(
158+
{
159+
"op": "advertise_service",
160+
"type": "std_srvs/SetBool",
161+
"service": service_path,
162+
}
163+
)
164+
)
165+
self.received_message = None
166+
self.advertise.advertise_service(advertise_msg)
167+
168+
# Call the advertised service using rosbridge
169+
self.received_message = None
170+
call_msg = loads(
171+
dumps(
172+
{
173+
"op": "call_service",
174+
"id": "foo",
175+
"service": service_path,
176+
"args": {"data": True},
177+
"timeout": 0.5,
178+
}
179+
)
180+
)
181+
Thread(target=self.call_service.call_service, args=(call_msg,)).start()
182+
183+
start_time = time.monotonic()
184+
while self.received_message is None:
185+
rclpy.spin_once(self.node, timeout_sec=0.1)
186+
if time.monotonic() - start_time > 0.3:
187+
self.fail("Timed out waiting for service call message.")
188+
189+
self.assertFalse(self.received_message is None)
190+
self.assertTrue("op" in self.received_message)
191+
self.assertEqual(self.received_message["op"], "call_service")
192+
self.assertTrue("id" in self.received_message)
193+
194+
self.received_message = None
195+
196+
start_time = time.monotonic()
197+
while self.received_message is None:
198+
rclpy.spin_once(self.node, timeout_sec=0.1)
199+
if time.monotonic() - start_time > 1.0:
200+
self.fail("Timed out waiting for service response message.")
201+
202+
self.assertFalse(self.received_message is None)
203+
self.assertEqual(self.received_message["op"], "service_response")
204+
self.assertFalse(self.received_message["result"])
205+
self.assertEqual(
206+
self.received_message["values"], "Timeout exceeded while waiting for service response"
207+
)
208+
153209
def test_unadvertise_with_live_request(self):
154210
# Advertise the service
155211
service_path = "/set_bool_3"

0 commit comments

Comments
 (0)