|
1 | 1 | #!/usr/bin/env python |
2 | 2 | import os |
3 | 3 | import sys |
| 4 | +import time |
4 | 5 | import unittest |
5 | 6 |
|
6 | 7 | from rclpy.callback_groups import ReentrantCallbackGroup |
@@ -55,3 +56,55 @@ def service_cb(req, res): |
55 | 56 | self.assertEqual(responses[0]["result"], True) |
56 | 57 |
|
57 | 58 | node.destroy_service(service) |
| 59 | + |
| 60 | + def service_long_cb(req, res): |
| 61 | + time.sleep(0.2) |
| 62 | + self.assertTrue(req.data) |
| 63 | + res.success = True |
| 64 | + res.message = "Hello, world!" |
| 65 | + return res |
| 66 | + |
| 67 | + service = node.create_service( |
| 68 | + SetBool, "/test_service_long", service_long_cb, callback_group=ReentrantCallbackGroup() |
| 69 | + ) |
| 70 | + |
| 71 | + responses_future, ws_client.message_handler = expect_messages( |
| 72 | + 2, "WebSocket", node.get_logger() |
| 73 | + ) |
| 74 | + responses_future.add_done_callback(lambda _: node.executor.wake()) |
| 75 | + |
| 76 | + ws_client.sendJson( |
| 77 | + { |
| 78 | + "op": "call_service", |
| 79 | + "type": "std_srvs/SetBool", |
| 80 | + "service": "/test_service_long", |
| 81 | + "args": {"data": True}, |
| 82 | + "timeout": 0.1, |
| 83 | + } |
| 84 | + ) |
| 85 | + |
| 86 | + ws_client.sendJson( |
| 87 | + { |
| 88 | + "op": "call_service", |
| 89 | + "type": "std_srvs/SetBool", |
| 90 | + "service": "/test_service_long", |
| 91 | + "args": {"data": True}, |
| 92 | + "timeout": 0.5, |
| 93 | + } |
| 94 | + ) |
| 95 | + |
| 96 | + responses = await responses_future |
| 97 | + self.assertEqual(len(responses), 2) |
| 98 | + self.assertEqual(responses[0]["op"], "service_response") |
| 99 | + self.assertEqual(responses[0]["service"], "/test_service_long") |
| 100 | + self.assertEqual( |
| 101 | + responses[0]["values"], "Timeout exceeded while waiting for service response" |
| 102 | + ) |
| 103 | + self.assertEqual(responses[0]["result"], False) |
| 104 | + |
| 105 | + self.assertEqual(responses[1]["op"], "service_response") |
| 106 | + self.assertEqual(responses[1]["service"], "/test_service_long") |
| 107 | + self.assertEqual(responses[1]["values"], {"success": True, "message": "Hello, world!"}) |
| 108 | + self.assertEqual(responses[1]["result"], True) |
| 109 | + |
| 110 | + node.destroy_service(service) |
0 commit comments