Files
orisys_arm/station/test/test_remote_camera_preview.py
T

54 lines
2.6 KiB
Python

import os
import tempfile
from pathlib import Path
from types import SimpleNamespace
from unittest import TestCase
from unittest.mock import patch
import threading
from station.remote_camera import settings,bridge_environment
from station.operator_camera_view import stream_targets
from station.control_service import StationService
from arm_application.site_io import load_site_dict
class RemotePreviewTest(TestCase):
def site(self):
site=load_site_dict();site['remote_camera_preview']={
'enabled':True,'domain':0,'host':'192.168.2.10','interface_address':'192.168.2.50',
'cameras':['d405_left','d435'],'transport':'raw'}
return site
def test_only_explicit_remote_streams_use_raw(self):
streams=stream_targets(self.site())
self.assertEqual({s['id'] for s in streams},{'d405_left','d435'})
self.assertTrue(all(s['preview_transport']=='raw' and s['source']=='remote' for s in streams))
def test_remote_environment_is_limited_to_preview_child(self):
parent={'ROS_DOMAIN_ID':'42','ROS_LOCALHOST_ONLY':'1','REAL_ROS_DOMAIN_ID':'42',
'ROS_DISCOVERY_SERVER':'some-other-server'}
before=dict(parent)
with tempfile.TemporaryDirectory() as folder:
env=bridge_environment(self.site(),parent,folder)
self.assertEqual(parent,before)
self.assertEqual((env['ROS_DOMAIN_ID'],env['ROS_LOCALHOST_ONLY']),('0','0'))
self.assertEqual(env['REAL_ROS_DOMAIN_ID'],'42')
self.assertNotIn('ROS_DISCOVERY_SERVER',env)
xml=Path(env['FASTRTPS_DEFAULT_PROFILES_FILE']).read_text()
self.assertIn('<address>192.168.2.50</address>',xml)
self.assertIn('<address>192.168.2.10</address>',xml)
self.assertEqual(bridge_environment({},parent,'/unused'),parent)
def test_bad_address_is_rejected_before_creating_profile(self):
site=self.site();site['remote_camera_preview']['host']='bad<xml>'
with self.assertRaises(ValueError):settings(site)
def test_refresh_does_not_touch_acquisition_or_robot(self):
gateway=SimpleNamespace(states=lambda:({},{}),graph=lambda:{'nodes':[],'topics':[],'services':[]},close=lambda:None)
service=StationService(gateway=gateway);service.site.update(self.site())
try:
with patch.object(service,'_camera') as camera,patch.object(service.processes,'start') as start:
result=service.execute('camera_refresh','89','eye_in_hand',{},threading.Event())
self.assertTrue(result['ok']);camera.assert_not_called();start.assert_not_called()
finally:service.close()