36 lines
1.6 KiB
Python
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()
|