Example #1
0
    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")
Example #2
0
    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")
Example #3
0
   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
Example #4
0
    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
Example #5
0
    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")
Example #6
0
   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
Example #7
0
    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")
Example #8
0
 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")
Example #9
0
    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")
Example #10
0
 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
Example #11
0
    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"] == [] )
Example #12
0
 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")
Example #13
0
    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"] == [])
Example #14
0
    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")
Example #15
0
    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")
Example #16
0
    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")
Example #17
0
    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
Example #18
0
                        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)
Example #19
0
 def selectorWait(self, fd):
     #print "selectorWait"
     self.send(newReader(self, ((self, "_selectorready"), fd)), "_selectorask")
Example #20
0
 def selectorWait(self, fd):
     self.debug("selectorWait")
     self.send(newReader(self, ((self, "_selectorready"), fd)), "_selectorask")
Example #21
0
 def selectorWait(self, fd):
     #print "selectorWait"
     self.send(newReader(self, ((self, "_selectorready"), fd)),
               "_selectorask")