def test_get_apvs(self): controller.subscribe('DEFAULT.PV', SubscriptionMode.Monitor(delta=0.01)) controller.subscribe('FOO.PV', SubscriptionMode.Monitor(delta=0.123)) controller.subscribe('BAR.PV', SubscriptionMode.Scan(period=123.1) ) pvnames = ('DEFAULT.PV', 'FOO.PV', 'BAR.PV') all_apvs = controller.get_apvs(pvnames) self.assertEqual( len(all_apvs), 3) for pvname in pvnames: self.assertIn(pvname, all_apvs) singleapv = controller.get_apv('DEFAULT.PV') defaultapv = all_apvs['DEFAULT.PV'] self.assertEqual( singleapv, defaultapv) self.assertEqual( defaultapv.name, 'DEFAULT.PV' ) self.assertEqual( defaultapv.mode.name, SubscriptionMode.Monitor.name ) self.assertEqual( defaultapv.mode.delta, 0.01 ) fooapv = all_apvs['FOO.PV'] self.assertEqual( fooapv.name, 'FOO.PV' ) self.assertEqual( fooapv.mode.name, SubscriptionMode.Monitor.name ) self.assertEqual( fooapv.mode.delta, 0.123 ) barapv = all_apvs['BAR.PV'] self.assertEqual( barapv.name, 'BAR.PV' ) self.assertEqual( barapv.mode.name , SubscriptionMode.Scan.name ) self.assertEqual( barapv.mode.period, 123.1 ) self.assertFalse(controller.get_apv('whatever')) self.assertRaises(TypeError, controller.get_apvs, 'not a collection')
def test_unsubscribe_scan(self): controller.subscribe(self.long_pvs[0], SubscriptionMode.Scan(period=1)) #check that the system has registered the subscription apv = controller.get_apv(self.long_pvs[0]) self.assertEqual( apv.name, self.long_pvs[0] ) # wait for a while so that we gather some data time.sleep(3) # request unsubscription unsub_req = controller.unsubscribe(self.long_pvs[0]) self.assertTrue(unsub_req) unsub_req.wait() before = controller.get_values(self.long_pvs[0]) # verify that the system has removed the pv apv = controller.get_apv(self.long_pvs[0]) self.assertFalse(apv.subscribed) # wait to see if we are still receiving data time.sleep(3) after = controller.get_values(self.long_pvs[0]) # we shouldn't have received any data during the last sleep period self.assertEqual(len(before), len(after)) # and the scan task's timer should have been cleaned up self.assertEqual(controller.timers.num_active_tasks, 0)
def test_unsubscribe_monitor(self): pvname = self.long_pvs[0] controller.subscribe(pvname, SubscriptionMode.Monitor(delta=0.01)) #check that the system has registered the subscription apv = controller.get_apv(pvname) self.assertEqual( apv.name, self.long_pvs[0] ) # wait for a while so that we gather some data time.sleep(2) # request unsubscription unsub_req = controller.unsubscribe(self.long_pvs[0]) self.assertTrue(unsub_req) unsub_req.wait() # take note of the data present before = controller.get_values(self.long_pvs[0])['rows'] # verify that the system has removed the pv apv = controller.get_apv(self.long_pvs[0]) self.assertFalse(apv.subscribed) # wait to see if we are still receiving data time.sleep(2) after = controller.get_values(self.long_pvs[0])['rows'] # we shouldn't have received any data during the last sleep period self.assertEqual(len(before), len(after))
def test_subscribe_resubscribe(self): # subscribe to an already subscribed pv, with a different mode perhaps pv = self.long_pvs[0] controller.subscribe(pv, SubscriptionMode.Scan(period=1)) apv = controller.get_apv(pv) self.assertEqual( apv.mode.period, 1) controller.subscribe(pv, SubscriptionMode.Scan(period=2)) apv = controller.get_apv(pv) self.assertEqual( apv.mode.period, 2)
def test_load_config(self): pvnames = ('DEFAULT.PV', 'FOO.PV', 'BAR.PV') futures = [] futures.append(controller.subscribe('DEFAULT.PV', SubscriptionMode.Monitor(delta=0.01))) futures.append(controller.subscribe('FOO.PV', SubscriptionMode.Monitor(0.123))) futures.append(controller.subscribe('BAR.PV', SubscriptionMode.Scan(123.1))) [ fut.wait() for fut in futures ] cfg = controller.save_config() futures = controller.munsubscribe([pvname for pvname, _ in controller.list_subscribed()]) [ fut.wait() for fut in futures ] logger.info("Trying to load:\n%s", cfg) futures = controller.load_config(cfg) results = [ fut.get() for fut in futures ] pvnames = [pvname for pvname, _ in controller.list_subscribed()] self.assertIn('DEFAULT.PV', pvnames) self.assertIn('FOO.PV', pvnames) self.assertIn('BAR.PV', pvnames) av = controller.get_apv('DEFAULT.PV') self.assertEqual( av.name, 'DEFAULT.PV' ) self.assertEqual( av.mode.name, SubscriptionMode.Monitor.name ) self.assertEqual( av.mode.delta, 0.01 ) av = controller.get_apv('FOO.PV') self.assertEqual( av.name, 'FOO.PV' ) self.assertEqual( av.mode.name, SubscriptionMode.Monitor.name ) self.assertEqual( av.mode.delta, 0.123 ) av = controller.get_apv('BAR.PV') self.assertEqual( av.name, 'BAR.PV' ) self.assertEqual( av.mode.name, SubscriptionMode.Scan.name ) self.assertEqual( av.mode.period, 123.1 )
def put(self, pvname): # modify if exists, ie, unsubscribe and resubscribe apv = controller.get_apv(pvname) if apv and apv.subscribed: controller.unsubscribe(pvname) # at this point, subscribe no matter what: if we were # already subscribed, we've just unsubscribed. body_json = self.request.body body = json.loads(body_json) # body should of the form # {mode: ...} mode = SubscriptionMode.parse(body["mode"]) try: future = controller.subscribe(pvname, mode) result = future.get(TIMEOUT) if result: self.win({"pvname": pvname, "mode": mode}) else: self.fail("Couldn't subscribe", {"pvname": pvname, "mode": mode}) except Exception as e: logger.exception(e) self.fail(str(e))
def get(self, pvname): apv = controller.get_apv(pvname) if apv: self.win(apv) else: self.fail(msg="Unknown PV '%s'" % pvname, code=404)