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 )
Exemple #6
0
    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))
Exemple #7
0
 def get(self, pvname):
     apv = controller.get_apv(pvname)
     if apv:
         self.win(apv)
     else:
         self.fail(msg="Unknown PV '%s'" % pvname, code=404)