36 lines
1.6 KiB
Python
36 lines
1.6 KiB
Python
import threading
|
|
import time
|
|
from unittest import TestCase
|
|
from station.tasks import TaskManager
|
|
|
|
|
|
class TasksTest(TestCase):
|
|
def setUp(self): self.manager=TaskManager()
|
|
def tearDown(self): self.manager.close()
|
|
def wait(self,token):
|
|
until=time.monotonic()+3
|
|
while time.monotonic()<until:
|
|
row=self.manager.snapshot(token)
|
|
if row['state'] not in ('running','queued'): return row
|
|
time.sleep(.01)
|
|
self.fail('task did not complete')
|
|
|
|
def test_resources_held_until_completion(self):
|
|
gate=threading.Event()
|
|
one=self.manager.submit('move',{'arm:89'},lambda cancel:(gate.wait(2),{'ok':True})[1])
|
|
with self.assertRaises(RuntimeError): self.manager.submit('move-again',{'arm:89'},lambda e:{'ok':True})
|
|
other=self.manager.submit('camera',{'camera'},lambda e:{'ok':True})
|
|
self.assertEqual(self.wait(other)['state'],'succeeded')
|
|
gate.set();self.assertEqual(self.wait(one)['state'],'succeeded')
|
|
next_task=self.manager.submit('next',{'arm:89'},lambda e:{'ok':True})
|
|
self.assertEqual(self.wait(next_task)['state'],'succeeded')
|
|
|
|
def test_cancel_and_exception_release_ownership(self):
|
|
token=self.manager.submit('long',{'arm'},lambda event:(event.wait(2),{'ok':False})[1])
|
|
self.manager.cancel(token)
|
|
self.assertEqual(self.wait(token)['state'],'cancelled')
|
|
def fail(event): raise ValueError('driver rejected')
|
|
token=self.manager.submit('reject',{'arm'},fail)
|
|
result=self.wait(token)
|
|
self.assertEqual(result['state'],'failed');self.assertIn('driver rejected',result['result']['message'])
|