from unittest.mock import patch from agebd.service.pvs import BasePVs from agebd.runner import CallbackRunner, PeriodicRunner from agebd.service.base import BaseService class DummyPV: def __init__(self, name): self.pvname = name self.value = None def put(self, value): self.value = value def get(self): return self.value class DummyAbortPV: def __init__(self, name): self.pvname = name self.i = 0 def put(self, value): self.value = value def get(self): """ Return False on first call to run code once, then return False """ if self.i == 0: self.i += 1 return False return True class DummyCallbackPV: def __init__(self, name): self.pvname = name self.value = None self._added_callback = False self._removed_callback = False def put(self, value): self.value = value def get(self): return self.value def add_callback(self, *args, **kwargs): self._added_callback = True def remove_callback(self, *args, **kwargs): self._removed_callback = True class FakePVs(BasePVs): CallbackPV = DummyCallbackPV("DummyCallbackPV") def __init__(self, service_name: str = "test-service", pv_factory=DummyPV): super().__init__(service_name, pv_factory) self.abort = DummyAbortPV("DummyAbortPV") self.onoff.value = 1 class FakeService(BaseService): def __init__(self, name: str, pvs: FakePVs, version: str = "test-version"): super().__init__(name, pvs, version) def update(self): pass def test_callbackrunner(): version = "version-0" pvs = FakePVs() svc_name = "test-service" svc = FakeService(svc_name, pvs, version) runner = CallbackRunner(svc) # Mock the pyepics poll function so it doesn't try to look at network sockets with patch("agebd.runner.poll"): runner.start() assert pvs.CallbackPV._added_callback assert pvs.CallbackPV._removed_callback assert pvs.status.get() == "killed" def test_periodicrunner(): version = "version-0" pvs = FakePVs() svc_name = "test-service" svc = FakeService(svc_name, pvs, version) runner = PeriodicRunner(svc) # Mock the pyepics sleep function so it doesn't try to sleep during tests with patch("agebd.runner.sleep"): runner.start() assert pvs.status.get() == "killed"