52 lines
2.5 KiB
Python
52 lines
2.5 KiB
Python
import os
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import time
|
|
from pathlib import Path
|
|
from unittest import TestCase
|
|
from station.rpc import call
|
|
|
|
|
|
class BackendTest(TestCase):
|
|
def test_offline_rpc_task_lifecycle_and_shutdown(self):
|
|
with tempfile.TemporaryDirectory() as folder:
|
|
socket=Path(folder)/'backend.sock'
|
|
proc=subprocess.Popen([sys.executable,'-m','station.control_service','--socket',str(socket),'--offline'],
|
|
stdout=subprocess.PIPE,stderr=subprocess.STDOUT,text=True)
|
|
try:
|
|
deadline=time.monotonic()+10
|
|
while not socket.exists() and proc.poll() is None and time.monotonic()<deadline: time.sleep(.05)
|
|
self.assertIsNone(proc.poll())
|
|
self.assertEqual(call(socket,'ping')['protocol'],1)
|
|
catalog=call(socket,'catalog')
|
|
unavailable={r['id'] for r in catalog['actions'] if not r['available']}
|
|
self.assertIn('gauge_run',unavailable)
|
|
with self.assertRaises(RuntimeError): call(socket,'submit',{'action':'__import__','arm':'89'})
|
|
arms=[]
|
|
while time.monotonic()<deadline:
|
|
snap=call(socket,'snapshot');arms=snap.get('arms',[])
|
|
if arms: break
|
|
time.sleep(.05)
|
|
self.assertTrue(arms)
|
|
aid=arms[0]['id']
|
|
token=call(socket,'submit',{'action':'handeye_show','arm':aid})['task_id']
|
|
while time.monotonic()<deadline:
|
|
row=call(socket,'task',{'task_id':token})
|
|
if row['state'] not in ('queued','running'): break
|
|
time.sleep(.05)
|
|
self.assertEqual(row['state'],'succeeded')
|
|
token=call(socket,'submit',{'action':'gripper_up','arm':aid})['task_id']
|
|
while time.monotonic()<deadline:
|
|
row=call(socket,'task',{'task_id':token})
|
|
if row['state'] not in ('queued','running'): break
|
|
time.sleep(.05)
|
|
self.assertEqual(row['state'],'failed');self.assertIn('离线',row['result']['message'])
|
|
finally:
|
|
proc.terminate()
|
|
try: output,_=proc.communicate(timeout=10)
|
|
except subprocess.TimeoutExpired:
|
|
proc.kill();output,_=proc.communicate();self.fail(output)
|
|
self.assertEqual(proc.returncode,0,output)
|
|
self.assertFalse(socket.exists())
|