Files
orisys_arm/station/test/test_operation_log.py
T

36 lines
1.6 KiB
Python

import json
import tempfile
import threading
import time
from pathlib import Path
from unittest import TestCase
from station.operation_log import OperationLog
from station.tasks import TaskManager
class OperationLogTest(TestCase):
def test_memory_bounded_but_disk_retains_every_event(self):
with tempfile.TemporaryDirectory() as folder:
log = OperationLog(Path(folder)/'events.jsonl', limit=2)
for i in range(5): log.add('received', str(i), action='stage_track', arm='89')
snap=log.snapshot()
self.assertEqual([r['seq'] for r in snap['events']], [4,5])
rows=[json.loads(line) for line in Path(snap['path']).read_text().splitlines()]
self.assertEqual([r['seq'] for r in rows],list(range(1,6)))
def test_fast_task_keeps_all_transitions_between_gui_polls(self):
manager=TaskManager()
try:
def execute(event):
manager.set_phase(event,'识别目标')
manager.set_phase(event,'识别目标')
return {'ok':True,'message':'执行完成'}
token=manager.submit('stage_track', {'robot-control'},execute,context={'arm':'89'})
deadline=time.monotonic()+2
while manager.snapshot(token)['state'] in ('queued','running') and time.monotonic()<deadline:
time.sleep(.01)
events=manager.events.snapshot()['events']
self.assertEqual([r['kind'] for r in events],['accepted','running','phase','succeeded'])
self.assertTrue(all(r['task_id']==token and r['arm']=='89' for r in events))
finally: manager.close()