Example #1
0
def run():
		
     # local heartbeat and Aggregator
     if options.aggregator:

          aggregator = Aggregator(options.agconfig)
          portal = create_portal(aggregator)
          
          heartbeat = Heartbeat(address=options.group, port=options.port)
          localip = socket.gethostbyname(socket.gethostname())
          heartbeat.setMessage(encode(options.id, localip, options.agport, aggregator.getPassword()))
          
          reactor.listenTCP(options.agport, pb.PBServerFactory(portal))
          aggregator.notifyOnMapped(heartbeat.start)

     # heartbeat monitor
     monitor = Monitor(address=options.group, port=options.port)

     # wx-twisted communication bridge (mediator)
     global twistedbridge
     twistedbridge = TwistedBridge(monitor)

     # monitor reports to the bridge via callbacks
     monitor.newHeartbeat(twistedbridge.newHeartbeat)
     monitor.lostHeartbeat(twistedbridge.lostHeartbeat)

     monitor.start()

     app = MyApp(redirect=False)
     app.MainLoop()
    def test_password(self):
        """Aggregator should have random password"""

        assert type(self.aggregator.getPassword()) == type("")

        # ensure a second instance has differing password ...
        conf = Configurator()
        conf.fromString('')
        other = Aggregator(conf)
        assert other.getPassword() != self.aggregator.getPassword()
    def setUpClass(self):
        """Start a DeviceServer in a child process to test against"""

        self.deviceserverprocess = SubProcessProtocol()
        self.deviceserverprocess.waitOnStartUp( ['server.py', 'deviceserver.conf', '-n'], \
                                                path=os.path.join(agdevicecontrol.path,'bin') )

        if self.deviceserverprocess.running is False:
            raise unittest.SkipTest, "DeviceServer didn't start correctly, skipping tests"

        #wait for slow single CPU buildbots to catch up
        import time
        time.sleep(1)

        # use the config above
        conf = Configurator()
        conf.fromString(configdata)

        # can be set by timeout
        self.failure = False


        # safety timeout
        self.timeout = reactor.callLater(10, self.failed, "Aggregator failed to connect to all deviceservers ... failing")
        
        self.aggregator = Aggregator(conf)
        self.done = False
        while not self.done:
            print "Waiting for aggregator to connect to deviceservers"
            reactor.iterate(0.1)
            if self.aggregator.connected:
                self.succeeded()

        if self.failure:
            raise unittest.SkipTest, "Aggregator didn't connect to all deviceservers ... skipping tests"



        # FIXME: we really should handle missing and newly appearing deviceservers.

        # safety timeout
        self.timeout = reactor.callLater(10, self.failed, "Aggregator failed to map all deviceservers ... failing")

        self.aggregator.notifyOnMapped(self.succeeded)

        self.done = False
        while not self.done:
            print "Waiting for aggregator to map deviceservers"
            reactor.iterate(0.1)


        if self.failure:
            raise unittest.SkipTest, "Aggregator didn't start correctly, skipping tests"
class TestAggregator(SignalMixin, unittest.TestCase):

    def setUpClass(self):
        """Start a DeviceServer in a child process to test against"""

        self.deviceserverprocess = SubProcessProtocol()
        self.deviceserverprocess.waitOnStartUp( ['server.py', 'deviceserver.conf', '-n'], \
                                                path=os.path.join(agdevicecontrol.path,'bin') )

        if self.deviceserverprocess.running is False:
            raise unittest.SkipTest, "DeviceServer didn't start correctly, skipping tests"

        #wait for slow single CPU buildbots to catch up
        import time
        time.sleep(1)

        # use the config above
        conf = Configurator()
        conf.fromString(configdata)

        # can be set by timeout
        self.failure = False


        # safety timeout
        self.timeout = reactor.callLater(10, self.failed, "Aggregator failed to connect to all deviceservers ... failing")
        
        self.aggregator = Aggregator(conf)
        self.done = False
        while not self.done:
            print "Waiting for aggregator to connect to deviceservers"
            reactor.iterate(0.1)
            if self.aggregator.connected:
                self.succeeded()

        if self.failure:
            raise unittest.SkipTest, "Aggregator didn't connect to all deviceservers ... skipping tests"



        # FIXME: we really should handle missing and newly appearing deviceservers.

        # safety timeout
        self.timeout = reactor.callLater(10, self.failed, "Aggregator failed to map all deviceservers ... failing")

        self.aggregator.notifyOnMapped(self.succeeded)

        self.done = False
        while not self.done:
            print "Waiting for aggregator to map deviceservers"
            reactor.iterate(0.1)


        if self.failure:
            raise unittest.SkipTest, "Aggregator didn't start correctly, skipping tests"



    def tearDownClass(self):
        """Stop the DeviceServer running in a child process"""
        print "*** tearDownClass: ", self.deviceserverprocess.done
        self.deviceserverprocess.waitOnShutDown()


    def succeeded(self, *args):
        """Allow reactor iteration loop in test proper to exit and pass test"""
        self.done = True
	if self.timeout is not None:
	    self.timeout.cancel()  # safety timeout no longer necessary
        self.timeout = None
        self.lastargs = args  # make persistent for later checks


    def failed(self, reason):
        """Allow reactor iteration loop in test proper to exit and fail test"""
        self.done = True
        self.failure = reason
        self.timeout.cancel()  # safety timeout no longer necessary
        self.timeout = None

    def setUp(self):
        """I'm called at the very beginning of each test"""
        self.done = False
        self.failure = None
        self.timeout = None


    def tearDown(self):
        """I'm called at the end of each test"""
        if self.timeout:
            self.timeout.cancel()


    def timedOut(self):
        """I'm called when the safety timer expires indicating test probably won't complete"""

        print "timedOut callback, test did not complete"
        self.failed("Safety timeout callback ... test did not complete")
        reactor.crash()


        

    #---------- tests proper ------------------------------------

    def test_handled_configurator(self):
        """Aggregator instantiated with a configurator rather than .conf filename"""
        assert 'DeviceServer1' in self.aggregator.config


    def test_password(self):
        """Aggregator should have random password"""

        assert type(self.aggregator.getPassword()) == type("")

        # ensure a second instance has differing password ...
        conf = Configurator()
        conf.fromString('')
        other = Aggregator(conf)
        assert other.getPassword() != self.aggregator.getPassword()



    def test_devicelist_as_deferred(self):
        """Return aggregated device list"""

        # safety timeout
        self.timeout = reactor.callLater(10, self.failed, "retrieving devicelist timed out ... failing")

        d = self.aggregator.getDeviceList()
        assert isinstance(d, defer.Deferred)
        d.addCallback(self.succeeded)
        
        # idle until code above triggers succeeded or timeout causes failure
        while not self.done:
            reactor.iterate(0.1)
        
        # will arrive here eventually when either succeeded or failed method has fired
        if self.failure:
            self.failed(self.failure)

        devicelist = self.lastargs[0]
        assert len(devicelist) == 2
        assert 'Device1' in devicelist
        assert 'Device2' in devicelist



    def test_devicemap_as_deferred(self):
        """Return aggregated device map"""

        # safety timeout
        self.timeout = reactor.callLater(10, self.failed, "retrieving devicemap timed out ... failing")

        d = self.aggregator.getDeviceMap()
        assert isinstance(d, defer.Deferred)

        # caution: as this deferred is ready-to-go, the callback is called *immediately*
        d.addCallback(self.succeeded)
        # i.e., self.succeeded has now been called
        
        # idle until code above triggers succeeded or timeout causes failure
        while not self.done:
             reactor.iterate(0.1)
        
        # will arrive here eventually when either succeeded or failed method has fired
        if self.failure:
            self.failed(self.failure)

        devicemap = self.lastargs[0]
        print devicemap
        assert type(devicemap) == types.DictType
        assert len(devicemap) == 1
        assert 'PseudoDevice' in devicemap
        assert len(devicemap['PseudoDevice']) == 2
        assert 'Device1' in devicemap['PseudoDevice']
        assert 'Device2' in devicemap['PseudoDevice']



    def test_device_execute(self):
        """Proxy forward command to correct DeviceServer"""

        # safety timeout
        self.timeout = reactor.callLater(10, self.failed, "executing remote setParameter timed out ... failing")

        # 3-digit random integer
        value = int(random.random()*1000)
	
	# get a device key for use in next step
	self.done = False
	d = self.aggregator.getDeviceList()
	d.addCallback(self.succeeded)
	d.addErrback(self.failed)

	while not self.done:
	    reactor.iterate(0.1)

	if self.failure:
	    self.fail(self.failure)

	print
	print "DEBUG:"
	device = self.lastargs[0][0]
	print device.name

        # store number in 'remote' PseudoDevice
        d = self.aggregator.deviceExecute(device, 'setParameter', value)
        assert isinstance(d, defer.Deferred)
        d.addCallback(self.succeeded)
        
        # idle until code above triggers succeeded or timeout causes failure
        self.done = False
        while not self.done:
            reactor.iterate(0.1)
        
        # will arrive here eventually when either succeeded or failed method has fired
        if self.failure:
            self.failed(self.failure)


        # safety timeout
        self.timeout = reactor.callLater(10, self.failed, "executing remote getParameter timed out ... failing")

        # store number in 'remote' PseudoDevice
        d = self.aggregator.deviceExecute(device, 'getParameter')
        assert isinstance(d, defer.Deferred)
        d.addCallback(self.succeeded)
        
        # idle until code above triggers succeeded or timeout causes failure
        self.done = False
        while not self.done:
            reactor.iterate(0.1)
        
        # will arrive here eventually when either succeeded or failed method has fired
        if self.failure:
            self.failed(self.failure)

        returnvalue = self.lastargs[0]
        assert returnvalue == value


    if False:
        test_handled_configurator = True
        test_devicelist_as_deferred = True
        test_devicemap_as_deferred = True
        test_device_execute = True
        test_password = True