1616import threading
1717import time
1818import traceback
19+ from typing import List
20+ from typing import Optional
21+ from typing import Tuple
1922from typing import TYPE_CHECKING
2023import unittest
2124
2225from rcl_interfaces .srv import GetParameters
2326import rclpy
27+ from rclpy .client import Client
2428import rclpy .context
2529import rclpy .executors
2630import rclpy .node
31+ from rclpy .service import Service
2732from rclpy .utilities import get_rmw_implementation_identifier
2833from test_msgs .srv import Empty
2934
35+ from typing_extensions import TypeAlias
36+
3037# TODO(sloretz) Reduce fudge once wait_for_service uses node graph events
3138TIME_FUDGE = 0.3
3239
40+ ClientGetParameters : TypeAlias = Client [GetParameters .Request ,
41+ GetParameters .Response ]
42+
43+ ServiceGetParameters : TypeAlias = Service [GetParameters .Request ,
44+ GetParameters .Response ]
45+
46+ TestServiceName : TypeAlias = List [Tuple [str , Optional [str ], Optional [List [str ]], str ]]
47+
3348
3449class TestClient (unittest .TestCase ):
3550
@@ -38,26 +53,26 @@ class TestClient(unittest.TestCase):
3853 node : rclpy .node .Node
3954
4055 @classmethod
41- def setUpClass (cls ):
56+ def setUpClass (cls ) -> None :
4257 cls .context = rclpy .context .Context ()
4358 rclpy .init (context = cls .context )
4459 cls .node = rclpy .create_node ('TestClient' , context = cls .context )
4560
4661 @classmethod
47- def tearDownClass (cls ):
62+ def tearDownClass (cls ) -> None :
4863 cls .node .destroy_node ()
4964 rclpy .shutdown (context = cls .context )
5065
5166 @classmethod
52- def do_test_service_name (cls , test_service_name_list ) :
67+ def do_test_service_name (cls , test_service_name_list : TestServiceName ) -> None :
5368 for service_name , ns , cli_args , target_service_name in test_service_name_list :
5469 node = rclpy .create_node (
5570 node_name = 'node_name' ,
5671 context = cls .context ,
5772 namespace = ns ,
5873 cli_args = cli_args ,
5974 start_parameter_services = False )
60- client = node .create_client (
75+ client : Client [ Empty . Request , Empty . Response ] = node .create_client (
6176 srv_type = Empty ,
6277 srv_name = service_name
6378 )
@@ -81,7 +96,7 @@ def _spin_rclpy_node(
8196# rclpy_node.destroy_node()
8297
8398 def test_wait_for_service_5sec (self ) -> None :
84- cli = self .node .create_client (GetParameters , 'get/parameters' )
99+ cli : ClientGetParameters = self .node .create_client (GetParameters , 'get/parameters' )
85100 try :
86101 start = time .monotonic ()
87102 self .assertFalse (cli .wait_for_service (timeout_sec = 5.0 ))
@@ -92,7 +107,7 @@ def test_wait_for_service_5sec(self) -> None:
92107 self .node .destroy_client (cli )
93108
94109 def test_wait_for_service_nowait (self ) -> None :
95- cli = self .node .create_client (GetParameters , 'get/parameters' )
110+ cli : ClientGetParameters = self .node .create_client (GetParameters , 'get/parameters' )
96111 try :
97112 start = time .monotonic ()
98113 self .assertFalse (cli .wait_for_service (timeout_sec = 0 ))
@@ -103,9 +118,9 @@ def test_wait_for_service_nowait(self) -> None:
103118 self .node .destroy_client (cli )
104119
105120 def test_wait_for_service_exists (self ) -> None :
106- cli = self .node .create_client (GetParameters , 'test_wfs_exists' )
107- srv = self .node .create_service (GetParameters , 'test_wfs_exists' ,
108- lambda request , response : None )
121+ cli : ClientGetParameters = self .node .create_client (GetParameters , 'test_wfs_exists' )
122+ srv : ServiceGetParameters = self .node .create_service (GetParameters , 'test_wfs_exists' ,
123+ lambda request , response : None )
109124 try :
110125 start = time .monotonic ()
111126 self .assertTrue (cli .wait_for_service (timeout_sec = 1.0 ))
@@ -117,8 +132,8 @@ def test_wait_for_service_exists(self) -> None:
117132 self .node .destroy_service (srv )
118133
119134 def test_concurrent_calls_to_service (self ) -> None :
120- cli = self .node .create_client (GetParameters , 'get/parameters' )
121- srv = self .node .create_service (
135+ cli : ClientGetParameters = self .node .create_client (GetParameters , 'get/parameters' )
136+ srv : ServiceGetParameters = self .node .create_service (
122137 GetParameters , 'get/parameters' ,
123138 lambda request , response : response )
124139 try :
@@ -138,8 +153,8 @@ def test_concurrent_calls_to_service(self) -> None:
138153 get_rmw_implementation_identifier () == 'rmw_connextdds' and platform .system () == 'Windows' ,
139154 reason = 'Source timestamp not implemented for Connext on Windows' )
140155 def test_service_timestamps (self ) -> None :
141- cli = self .node .create_client (GetParameters , 'get/parameters' )
142- srv = self .node .create_service (
156+ cli : ClientGetParameters = self .node .create_client (GetParameters , 'get/parameters' )
157+ srv : ServiceGetParameters = self .node .create_service (
143158 GetParameters , 'get/parameters' ,
144159 lambda request , response : response )
145160 try :
@@ -150,6 +165,7 @@ def test_service_timestamps(self) -> None:
150165 result = srv .handle .service_take_request (srv .srv_type .Request )
151166 if result != (None , None ):
152167 request , header = result
168+ assert header is not None
153169 self .assertTrue (header is not None )
154170 self .assertNotEqual (0 , header .source_timestamp )
155171 return
@@ -161,8 +177,8 @@ def test_service_timestamps(self) -> None:
161177 self .node .destroy_service (srv )
162178
163179 def test_different_type_raises (self ) -> None :
164- cli = self .node .create_client (GetParameters , 'get/parameters' )
165- srv = self .node .create_service (
180+ cli : ClientGetParameters = self .node .create_client (GetParameters , 'get/parameters' )
181+ srv : ServiceGetParameters = self .node .create_service (
166182 GetParameters , 'get/parameters' ,
167183 lambda request , response : 'different response type' )
168184 try :
@@ -180,7 +196,7 @@ def test_different_type_raises(self) -> None:
180196 self .node .destroy_service (srv )
181197
182198 def test_get_service_name (self ) -> None :
183- test_service_name_list = [
199+ test_service_name_list : TestServiceName = [
184200 # test_service_name, namespace, cli_args for remap, expected service name
185201 # No namespaces
186202 ('service' , None , None , '/service' ),
@@ -197,7 +213,7 @@ def test_get_service_name(self) -> None:
197213 TestClient .do_test_service_name (test_service_name_list )
198214
199215 def test_get_service_name_after_remapping (self ) -> None :
200- test_service_name_list = [
216+ test_service_name_list : TestServiceName = [
201217 ('service' , None , ['--ros-args' , '--remap' , 'service:=new_service' ], '/new_service' ),
202218 ('service' , 'ns' , ['--ros-args' , '--remap' , 'service:=new_service' ],
203219 '/ns/new_service' ),
@@ -209,9 +225,10 @@ def test_get_service_name_after_remapping(self) -> None:
209225 TestClient .do_test_service_name (test_service_name_list )
210226
211227 def test_sync_call (self ) -> None :
212- def _service (request , response ):
228+ def _service (request : GetParameters .Request ,
229+ response : GetParameters .Response ) -> GetParameters .Response :
213230 return response
214- cli = self .node .create_client (GetParameters , 'get/parameters' )
231+ cli : ClientGetParameters = self .node .create_client (GetParameters , 'get/parameters' )
215232 srv = self .node .create_service (GetParameters , 'get/parameters' , _service )
216233 try :
217234 self .assertTrue (cli .wait_for_service (timeout_sec = 20 ))
@@ -231,10 +248,11 @@ def _service(request, response):
231248 self .node .destroy_service (srv )
232249
233250 def test_sync_call_timeout (self ) -> None :
234- def _service (request , response ):
251+ def _service (request : GetParameters .Request ,
252+ response : GetParameters .Response ) -> GetParameters .Response :
235253 time .sleep (1 )
236254 return response
237- cli = self .node .create_client (GetParameters , 'get/parameters' )
255+ cli : ClientGetParameters = self .node .create_client (GetParameters , 'get/parameters' )
238256 srv = self .node .create_service (GetParameters , 'get/parameters' , _service )
239257 try :
240258 self .assertTrue (cli .wait_for_service (timeout_sec = 20 ))
@@ -254,8 +272,10 @@ def _service(request, response):
254272 self .node .destroy_service (srv )
255273
256274 def test_sync_call_context_manager (self ) -> None :
257- def _service (request , response ):
275+ def _service (request : GetParameters .Request ,
276+ response : GetParameters .Response ) -> GetParameters .Response :
258277 return response
278+ cli : ClientGetParameters
259279 with self .node .create_client (GetParameters , 'get/parameters' ) as cli :
260280 with self .node .create_service (GetParameters , 'get/parameters' , _service ):
261281 self .assertTrue (cli .wait_for_service (timeout_sec = 20 ))
0 commit comments