2626# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
2727# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
2828# POSSIBILITY OF SUCH DAMAGE. 
29- 
30- 
29+ import   os 
30+ import   sys 
3131import  time 
3232import  unittest 
3333
3434import  pytest 
3535import  rclpy 
36- from  launch  import  LaunchDescription 
37- from  launch .actions  import  DeclareLaunchArgument , ExecuteProcess , IncludeLaunchDescription 
38- from  launch .launch_description_sources  import  PythonLaunchDescriptionSource 
39- from  launch .substitutions  import  LaunchConfiguration , PathJoinSubstitution 
40- from  launch_ros .substitutions  import  FindPackagePrefix , FindPackageShare 
41- from  launch_testing .actions  import  ReadyToTest 
4236from  rclpy .node  import  Node 
43- from  std_srvs .srv  import  Trigger 
4437from  ur_dashboard_msgs .msg  import  RobotMode 
45- from  ur_dashboard_msgs .srv  import  (
46-     GetLoadedProgram ,
47-     GetProgramState ,
48-     GetRobotMode ,
49-     IsProgramRunning ,
50-     Load ,
51- )
5238
53- TIMEOUT_WAIT_SERVICE  =  10 
54- # If we download the docker image simultaneously to the tests, it can take quite some time until the 
55- # dashboard server is reachable and usable. 
56- TIMEOUT_WAIT_SERVICE_INITIAL  =  120 
39+ sys .path .append (os .path .dirname (__file__ ))
40+ from  test_common  import  DashboardInterface , generate_dashboard_test_description   # noqa: E402 
5741
5842
5943@pytest .mark .launch_test  
6044def  generate_test_description ():
45+ < << << <<  HEAD 
6146    declared_arguments  =  []
6247
6348    declared_arguments .append (
@@ -104,6 +89,9 @@ def generate_test_description():
10489    )
10590
10691    return  LaunchDescription (declared_arguments  +  [ReadyToTest (), dashboard_client , ursim ])
92+ == == == = 
93+     return  generate_dashboard_test_description ()
94+ >> >> >> >  b28a870  (Simplify  tests  (#849)) 
10795
10896
10997class  DashboardClientTest (unittest .TestCase ):
@@ -121,38 +109,7 @@ def tearDownClass(cls):
121109        rclpy .shutdown ()
122110
123111    def  init_robot (self ):
124-         # We wait longer for the first client, as the robot is still starting up 
125-         power_on_client  =  waitForService (
126-             self .node , "/dashboard_client/power_on" , Trigger , timeout = TIMEOUT_WAIT_SERVICE_INITIAL 
127-         )
128- 
129-         # Connect to all other expected services 
130-         dashboard_interfaces  =  {
131-             "power_off" : Trigger ,
132-             "brake_release" : Trigger ,
133-             "unlock_protective_stop" : Trigger ,
134-             "restart_safety" : Trigger ,
135-             "get_robot_mode" : GetRobotMode ,
136-             "load_installation" : Load ,
137-             "load_program" : Load ,
138-             "close_popup" : Trigger ,
139-             "get_loaded_program" : GetLoadedProgram ,
140-             "program_state" : GetProgramState ,
141-             "program_running" : IsProgramRunning ,
142-             "play" : Trigger ,
143-             "stop" : Trigger ,
144-         }
145-         self .dashboard_clients  =  {
146-             srv_name : waitForService (self .node , f"/dashboard_client/{ srv_name }  " , srv_type )
147-             for  (srv_name , srv_type ) in  dashboard_interfaces .items ()
148-         }
149- 
150-         # Add first client to dict 
151-         self .dashboard_clients ["power_on" ] =  power_on_client 
152- 
153-     # 
154-     # Test functions 
155-     # 
112+         self ._dashboard_interface  =  DashboardInterface (self .node )
156113
157114    def  test_switch_on (self ):
158115        """Test power on a robot.""" 
@@ -161,59 +118,34 @@ def test_switch_on(self):
161118        mode  =  RobotMode .DISCONNECTED 
162119        while  mode  !=  RobotMode .POWER_OFF  and  time .time () <  end_time :
163120            time .sleep (0.1 )
164-             result  =  self .call_dashboard_service ( "get_robot_mode" ,  GetRobotMode . Request () )
121+             result  =  self ._dashboard_interface . get_robot_mode ( )
165122            self .assertTrue (result .success )
166123            mode  =  result .robot_mode .mode 
167124
168125        # Power on robot 
169-         self .assertTrue (self .call_dashboard_service ( "power_on" ,  Trigger . Request () ).success )
126+         self .assertTrue (self ._dashboard_interface . power_on ( ).success )
170127
171128        # Wait until robot mode changes 
172129        end_time  =  time .time () +  10 
173130        mode  =  RobotMode .DISCONNECTED 
174131        while  mode  not  in   (RobotMode .IDLE , RobotMode .RUNNING ) and  time .time () <  end_time :
175132            time .sleep (0.1 )
176-             result  =  self .call_dashboard_service ( "get_robot_mode" ,  GetRobotMode . Request () )
133+             result  =  self ._dashboard_interface . get_robot_mode ( )
177134            self .assertTrue (result .success )
178135            mode  =  result .robot_mode .mode 
179136
180137        self .assertIn (mode , (RobotMode .IDLE , RobotMode .RUNNING ))
181138
182139        # Release robot brakes 
183-         self .assertTrue (self .call_dashboard_service ( "brake_release" ,  Trigger . Request () ).success )
140+         self .assertTrue (self ._dashboard_interface . brake_release ( ).success )
184141
185142        # Wait until robot mode is RUNNING 
186143        end_time  =  time .time () +  10 
187144        mode  =  RobotMode .DISCONNECTED 
188145        while  mode  !=  RobotMode .RUNNING  and  time .time () <  end_time :
189146            time .sleep (0.1 )
190-             result  =  self .call_dashboard_service ( "get_robot_mode" ,  GetRobotMode . Request () )
147+             result  =  self ._dashboard_interface . get_robot_mode ( )
191148            self .assertTrue (result .success )
192149            mode  =  result .robot_mode .mode 
193150
194151        self .assertEqual (mode , RobotMode .RUNNING )
195- 
196-     # 
197-     # Utility functions 
198-     # 
199- 
200-     def  call_dashboard_service (self , srv_name , request ):
201-         self .node .get_logger ().info (
202-             f"Calling dashboard service '{ srv_name }  ' with request { request }  " 
203-         )
204-         future  =  self .dashboard_clients [srv_name ].call_async (request )
205-         rclpy .spin_until_future_complete (self .node , future )
206-         if  future .result () is  not   None :
207-             self .node .get_logger ().info (f"Received result { future .result ()}  " )
208-             return  future .result ()
209-         else :
210-             raise  Exception (f"Exception while calling service: { future .exception ()}  " )
211- 
212- 
213- def  waitForService (node , srv_name , srv_type , timeout = TIMEOUT_WAIT_SERVICE ):
214-     client  =  node .create_client (srv_type , srv_name )
215-     if  client .wait_for_service (timeout ) is  False :
216-         raise  Exception (f"Could not reach service '{ srv_name }  ' within timeout of { timeout }  " )
217- 
218-     node .get_logger ().info (f"Successfully connected to service '{ srv_name }  '" )
219-     return  client 
0 commit comments