def test_SendingMultipleReadersResultsInAllSelected(self): "main - Sending multiple newReader messages results in all being select()ed" MOCKSELECTORMODULE = MockSelect() SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() dummyservice = (Axon.Component.component(), "inbox") S._deliver(newReader(S, (dummyservice, "LOOKINGFORTHIS")), "notify") S._deliver(newReader(S, (dummyservice, "LOOKINGFORTHISTOO")), "notify") S._deliver(newReader(S, (dummyservice, "LOOKINGFORANDTHIS")), "notify") for i in xrange(100): S.next() lastfunc, lastargs = None, None i = 0 func, args = MOCKSELECTORMODULE.log[i] while not ((lastfunc, lastargs) == (func, args)): # Search for quiescent state i = i + 1 lastfunc, lastargs = func, args func, args = MOCKSELECTORMODULE.log[i] self.assertEqual("select", func, "select was called in the main loop") self.assertEqual( ["LOOKINGFORTHIS", "LOOKINGFORTHISTOO", "LOOKINGFORANDTHIS"], args[0]) #, "The selectable was added to the list of readables")
def test_ActivityOnAnyReaderResultsInMessageOnThatReadersService(self): "main - Activity on a selectable results in a message appearing in the service provided to the selector for that selectable" MOCKSELECTORMODULE = MockSelect(results=[ (["LOOKINGFORTHIS"],[],[]), (["THENFORTHIS"],[],[]), (["ANDTHENFORTHIS"],[],[]) ]) SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() D = Axon.Component.component() E = Axon.Component.component() F = Axon.Component.component() dummyservice1 = (D, "inbox") S._deliver(newReader(S,( dummyservice1, "LOOKINGFORTHIS") ),"notify") dummyservice2 = (E, "inbox") S._deliver(newReader(S,( dummyservice2, "THENFORTHIS") ),"notify") dummyservice3 = (F, "inbox") S._deliver(newReader(S,( dummyservice3, "ANDTHENFORTHIS") ),"notify") for i in xrange(100): S.next(); try: S.postoffice.next() except: pass selectable = D.recv("inbox") self.assertEqual(selectable,"LOOKINGFORTHIS")#, "The value returned should be the selectable we originally asked for") selectable = E.recv("inbox") self.assertEqual(selectable,"THENFORTHIS")#, "The value returned should be the selectable we originally asked for") selectable = F.recv("inbox") self.assertEqual(selectable,"ANDTHENFORTHIS")#, "The value returned should be the selectable we originally asked for")
def handleNewConnection(self): """\ Handle notifications from the selector service of new connection requests. Accepts and sets up new connections, wiring them up and passing them on via the "protocolHandlerSignal" outbox. """ if self.dataReady("newconnection"): data = self.recv("newconnection") # If we recieve information on data ready, for a server it means we have a new connection # to handle try: newsock, CSA = self.createConnectedSocket(self.listener) except socket.error, e: (errorno,errmsg) = e if errorno != errno.EAGAIN: if errorno != errno.EWOULDBLOCK: raise e else: pass self.send(_ki.newCSA(self, CSA), "protocolHandlerSignal") self.send(newReader(CSA, ((CSA, "ReadReady"), newsock)), "_selectorSignal") self.send(newWriter(CSA, ((CSA, "SendReady"), newsock)), "_selectorSignal") self.addChildren(CSA) self.link((CSA, "CreatorFeedback"),(self,"_feedbackFromCSA")) return CSA
def handleNewConnection(self): """\ Handle notifications from the selector service of new connection requests. Accepts and sets up new connections, wiring them up and passing them on via the "protocolHandlerSignal" outbox. """ if self.dataReady("newconnection"): data = self.recv("newconnection") # If we recieve information on data ready, for a server it means we have a new connection # to handle try: newsock, CSA = self.createConnectedSocket(self.listener) except socket.error, e: (errorno, errmsg) = e if errorno != errno.EAGAIN: if errorno != errno.EWOULDBLOCK: raise e else: pass self.send(_ki.newCSA(self, CSA), "protocolHandlerSignal") self.send(newReader(CSA, ((CSA, "ReadReady"), newsock)), "_selectorSignal") self.send(newWriter(CSA, ((CSA, "SendReady"), newsock)), "_selectorSignal") self.addChildren(CSA) self.link((CSA, "CreatorFeedback"), (self, "_feedbackFromCSA")) return CSA
def test_ActivityOnAnyReaderResultsInMessageOnThatReadersService(self): "main - Activity on a selectable results in a message appearing in the service provided to the selector for that selectable" MOCKSELECTORMODULE = MockSelect( results=[(["LOOKINGFORTHIS"], [], []), (["THENFORTHIS"], [], []), (["ANDTHENFORTHIS"], [], [])]) SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() D = Axon.Component.component() E = Axon.Component.component() F = Axon.Component.component() dummyservice1 = (D, "inbox") S._deliver(newReader(S, (dummyservice1, "LOOKINGFORTHIS")), "notify") dummyservice2 = (E, "inbox") S._deliver(newReader(S, (dummyservice2, "THENFORTHIS")), "notify") dummyservice3 = (F, "inbox") S._deliver(newReader(S, (dummyservice3, "ANDTHENFORTHIS")), "notify") for i in xrange(100): S.next() try: S.postoffice.next() except: pass selectable = D.recv("inbox") self.assertEqual( selectable, "LOOKINGFORTHIS" ) #, "The value returned should be the selectable we originally asked for") selectable = E.recv("inbox") self.assertEqual( selectable, "THENFORTHIS" ) #, "The value returned should be the selectable we originally asked for") selectable = F.recv("inbox") self.assertEqual( selectable, "ANDTHENFORTHIS" ) #, "The value returned should be the selectable we originally asked for")
def main(self): selectorService, selectorShutdownService, newSelector = Selector.getSelectorServices(self.tracker) if newSelector: newSelector.activate() self.link((self, "_selectorSignal"),selectorService) self.send(newReader(self, ((self, "newconnection"), self.listener)), "_selectorSignal") yield 1 while 1: # self.pause() if self.anyClosedSockets(): for i in xrange(10): yield 1 self.handleNewConnection() # Data ready means that we have a connection waiting. yield 1
def test_SendingMultipleReadersResultsInAllSelected(self): "main - Sending multiple newReader messages results in all being select()ed" MOCKSELECTORMODULE = MockSelect() SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() dummyservice = (Axon.Component.component(), "inbox") S._deliver(newReader(S,( dummyservice, "LOOKINGFORTHIS") ),"notify") S._deliver(newReader(S,( dummyservice, "LOOKINGFORTHISTOO") ),"notify") S._deliver(newReader(S,( dummyservice, "LOOKINGFORANDTHIS") ),"notify") for i in xrange(100): S.next() lastfunc, lastargs = None, None i = 0 func, args = MOCKSELECTORMODULE.log[i] while not( (lastfunc, lastargs) == (func, args)): # Search for quiescent state i = i + 1 lastfunc, lastargs = func, args func, args = MOCKSELECTORMODULE.log[i] self.assertEqual("select", func, "select was called in the main loop") self.assertEqual(["LOOKINGFORTHIS","LOOKINGFORTHISTOO","LOOKINGFORANDTHIS"], args[0])#, "The selectable was added to the list of readables")
def test_SendingAReadableMessageResultsInItBeingSelectedAgainst(self): "main - If we send a newReader message to the notify inbox, it results in the selectable reader being selected on in the readers set" MOCKSELECTORMODULE = MockSelect() SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() dummyservice = (Axon.Component.component(), "inbox") S._deliver(newReader(S,( dummyservice, "LOOKINGFORTHIS")),"notify") for i in xrange(100): S.next() func, args = MOCKSELECTORMODULE.log[0] self.assertEqual("select", func, "select was called in the main loop") self.assertEqual(["LOOKINGFORTHIS"], args[0], "The selectable was added to the list of readables") self.assertEqual([], args[1], "Writable set should be empty") self.assertEqual([], args[2], "Exception set should be empty") self.assertEqual(0, args[3], "The select should be non-blocking")
def test_WeSendTheSelectorAServiceAndSelectableOnlySelectsTheSelectable(self): "main - When we send the newReader message, it also includes a service upon which the selector can talk back to us. The selector only selects on the selectable part of the newReader message" MOCKSELECTORMODULE = MockSelect() SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() dummyservice = (Axon.Component.component(), "inbox") S._deliver(newReader(S,( dummyservice, "LOOKINGFORTHIS") ),"notify") for i in xrange(100): S.next() func, args = MOCKSELECTORMODULE.log[0] self.assertEqual("select", func, "select was called in the main loop") self.assertEqual(["LOOKINGFORTHIS"], args[0])#, "The selectable was added to the list of readables") self.assertEqual([], args[1], "Writable set should be empty") self.assertEqual([], args[2], "Exception set should be empty") self.assertEqual(0, args[3], "The select should be non-blocking")
def main(self): selectorService, selectorShutdownService, newSelector = Selector.getSelectorServices( self.tracker) if newSelector: newSelector.activate() self.link((self, "_selectorSignal"), selectorService) self.send(newReader(self, ((self, "newconnection"), self.listener)), "_selectorSignal") yield 1 while 1: # self.pause() if self.anyClosedSockets(): for i in xrange(10): yield 1 self.handleNewConnection( ) # Data ready means that we have a connection waiting. yield 1
def test_RemoveReader_ResultsInReaderNoLongerBeingSelectedOrWiredIn(self): "main - Sending a remove reader message unwires/links a component, and also removes it's selectable from the readers list" MOCKSELECTORMODULE = MockSelect(results=[ ([], [], [] )]) SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() D = Axon.Component.component() dummyservice = (D, "inbox") S._deliver(newReader(S,( dummyservice, "LOOKINGFORTHIS") ),"notify") S._deliver(removeReader(S,"LOOKINGFORTHIS"),"notify") for i in xrange(100): S.next(); try: S.postoffice.next() except: pass self.assert_( D.inboxes["inbox"] == [] )
def test_SendingAReadableMessageResultsInItBeingSelectedAgainst(self): "main - If we send a newReader message to the notify inbox, it results in the selectable reader being selected on in the readers set" MOCKSELECTORMODULE = MockSelect() SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() dummyservice = (Axon.Component.component(), "inbox") S._deliver(newReader(S, (dummyservice, "LOOKINGFORTHIS")), "notify") for i in xrange(100): S.next() func, args = MOCKSELECTORMODULE.log[0] self.assertEqual("select", func, "select was called in the main loop") self.assertEqual(["LOOKINGFORTHIS"], args[0], "The selectable was added to the list of readables") self.assertEqual([], args[1], "Writable set should be empty") self.assertEqual([], args[2], "Exception set should be empty") self.assertEqual(0, args[3], "The select should be non-blocking")
def test_RemoveReader_ResultsInReaderNoLongerBeingSelectedOrWiredIn(self): "main - Sending a remove reader message unwires/links a component, and also removes it's selectable from the readers list" MOCKSELECTORMODULE = MockSelect(results=[([], [], [])]) SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() D = Axon.Component.component() dummyservice = (D, "inbox") S._deliver(newReader(S, (dummyservice, "LOOKINGFORTHIS")), "notify") S._deliver(removeReader(S, "LOOKINGFORTHIS"), "notify") for i in xrange(100): S.next() try: S.postoffice.next() except: pass self.assert_(D.inboxes["inbox"] == [])
def test_ActivityOnReaderResultsInMessageOnReadersService(self): "main - Activity on the selectable results in a message appearing in the service provided to the selector" MOCKSELECTORMODULE = MockSelect() SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() D = Axon.Component.component() dummyservice = (D, "inbox") S._deliver(newReader(S,( dummyservice, "LOOKINGFORTHIS") ),"notify") for i in xrange(100): S.next(); try: S.postoffice.next() except: pass self.assert_(not ( D.inboxes["inbox"] == [] ) ) selectable = D.recv("inbox") self.assertEqual(selectable,"LOOKINGFORTHIS")#, "The value returned should be the selectable we originally asked for")
def test_WeSendTheSelectorAServiceAndSelectableOnlySelectsTheSelectable( self): "main - When we send the newReader message, it also includes a service upon which the selector can talk back to us. The selector only selects on the selectable part of the newReader message" MOCKSELECTORMODULE = MockSelect() SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() dummyservice = (Axon.Component.component(), "inbox") S._deliver(newReader(S, (dummyservice, "LOOKINGFORTHIS")), "notify") for i in xrange(100): S.next() func, args = MOCKSELECTORMODULE.log[0] self.assertEqual("select", func, "select was called in the main loop") self.assertEqual( ["LOOKINGFORTHIS"], args[0]) #, "The selectable was added to the list of readables") self.assertEqual([], args[1], "Writable set should be empty") self.assertEqual([], args[2], "Exception set should be empty") self.assertEqual(0, args[3], "The select should be non-blocking")
def test_ActivityOnReaderResultsInMessageOnReadersService(self): "main - Activity on the selectable results in a message appearing in the service provided to the selector" MOCKSELECTORMODULE = MockSelect() SELECTORMODULE.select = MOCKSELECTORMODULE S = Selector() S.activate() for i in xrange(100): S.next() D = Axon.Component.component() dummyservice = (D, "inbox") S._deliver(newReader(S, (dummyservice, "LOOKINGFORTHIS")), "notify") for i in xrange(100): S.next() try: S.postoffice.next() except: pass self.assert_(not (D.inboxes["inbox"] == [])) selectable = D.recv("inbox") self.assertEqual( selectable, "LOOKINGFORTHIS" ) #, "The value returned should be the selectable we originally asked for")
def main(self): writeBuffer = [] shutdownMessage = False selectorService, selectorShutdownService, S = Selector.getSelectorServices(self.tracker) if S: S.activate() yield 1 yield 1 yield 1 self.link((self, "selector"), (selectorService)) # self.link((self, "selectorsignal"), (selectorShutdownService)) x = self.openSubprocess() self.send(newWriter(self, ((self, "stdinready"), x.stdin)), "selector") self.send(newReader(self, ((self, "stderrready"), x.stderr)), "selector") self.send(newReader(self, ((self, "stdoutready"), x.stdout)), "selector") # Assume all ready stdin_ready = 1 stdout_ready = 1 stderr_ready = 1 exit_status = x.poll() # while x.poll() is None success = 0 while exit_status is None: exit_status = x.poll() if (not self.anyReady()) and not (stdin_ready + stdout_ready + stderr_ready): print self.name, "Mighty Foo", stdin_ready, stdout_ready, stderr_ready, len(self.inboxes["inbox"]), len( writeBuffer ) self.pause() yield 1 continue while self.dataReady("inbox"): d = self.recv("inbox") writeBuffer.append(d) if self.dataReady("stdinready"): self.recv("stdinready") stdin_ready = 1 if self.dataReady("stdoutready"): self.recv("stdoutready") stdout_ready = 1 if self.dataReady("stderrready"): self.recv("stderrready") stderr_ready = 1 if len(writeBuffer) > 10000: writeBuffer = writeBuffer[-10000:] if stdin_ready: while len(writeBuffer) > 0: d = writeBuffer[0] # d = writeBuffer.pop(0) try: count = os.write(x.stdin.fileno(), d) writeBuffer.pop(0) success += 1 except OSError, e: success -= 1 print self.name, "Mighty FooBar", len(self.inboxes["inbox"]), len(writeBuffer) # Stdin wasn't ready. Let's send through a newWriter request # Want to wait stdin_ready = 0 writeBuffer = writeBuffer[len(writeBuffer) / 2 :] self.send(newWriter(self, ((self, "stdinready"), x.stdin)), "selector") print self.name, "OK, we're waiting....", len(self.inboxes["inbox"]), len(writeBuffer) break # Break out of this loop except: print self.name, "Unexpected error whilst trying to write to stdin:" print sys.exc_info()[0] break
print self.name, "Unexpected error whilst trying to write to stdin:" print sys.exc_info()[0] break # if count != len(d): # raise "Yay, we broke it" if stdout_ready: try: Y = os.read(x.stdout.fileno(), 2048) if len(Y) > 0: self.send(Y, "outbox") except OSError, e: # print "Mighty Bingle", len(self.inboxes["inbox"]), len(writeBuffer) # stdout wasn't ready. Let's send through a newReader request stdout_ready = 0 self.send(newReader(self, ((self, "stdoutready"), x.stdout)), "selector") except: print self.name, "Unexpected error whilst trying to read stdout:" print sys.exc_info()[0] pass if stderr_ready: # FIXME: This needs fixing before release try: Y = os.read(x.stderr.fileno(), 2048) # TEMPORARY DIVERSION OF STDERR TO OUTBOX TOO if len(Y) > 0: self.send(Y, "outbox") # No particular plans for stderr except OSError, e: print self.name, "Mighty Jibble", len(self.inboxes["inbox"]), len(writeBuffer)
def selectorWait(self, fd): #print "selectorWait" self.send(newReader(self, ((self, "_selectorready"), fd)), "_selectorask")
def selectorWait(self, fd): self.debug("selectorWait") self.send(newReader(self, ((self, "_selectorready"), fd)), "_selectorask")