Пример #1
0
    def test_killing_dormant(self):
        state = []

        def test():
            try:
                state.append('start')
                sleep(DELAY)
            except:
                state.append('except')
                # catching GreenletExit
                pass
            # when switching to hub, hub makes itself the parent of this greenlet,
            # thus after the function's done, the control will go to the parent
            # QQQ why the first sleep is not enough?
            sleep(0)
            state.append('finished')

        g = spawn(test)
        sleep(DELAY / 2)
        assert state == ['start'], state
        kill(g)
        # will not get there, unless switching is explicitly scheduled by kill
        assert state == ['start', 'except'], state
        sleep(DELAY)
        assert state == ['start', 'except', 'finished'], state
Пример #2
0
    def test_blocks_on_pool(self):
        waiter = coros.queue(0)

        def greedy():
            self.pool.get()
            self.pool.get()
            self.pool.get()
            self.pool.get()
            # No one should be waiting yet.
            self.assertEquals(self.pool.waiting(), 0)
            # The call to the next get will unschedule this routine.
            self.pool.get()
            # So this send should never be called.
            waiter.send('Failed!')

        killable = api.spawn(greedy)

        # no one should be waiting yet.
        self.assertEquals(self.pool.waiting(), 0)

        ## Wait for greedy
        api.sleep(0)

        ## Greedy should be blocking on the last get
        self.assertEquals(self.pool.waiting(), 1)

        ## Send will never be called, so balance should be 0.
        self.assertFalse(waiter.ready())

        api.kill(killable)
Пример #3
0
 def end(self):
     if self._done:
         return
     self._done = True
     notification_center = NotificationCenter()
     if not self._initialize_done:
         # we are in the middle of initialize()
         try:
             msrp_connector = self.msrp_connector
             if self.greenlet is not None:
                 api.kill(self.greenlet)
             if msrp_connector is not None:
                 msrp_connector.cleanup()
         finally:
             notification_center.post_notification(
                 'MediaStreamDidNotInitialize',
                 sender=self,
                 data=NotificationData(reason='Interrupted'))
             notification_center.remove_observer(self, sender=self)
             self.msrp_connector = None
             self.greenlet = None
     else:
         notification_center.post_notification('MediaStreamWillEnd',
                                               sender=self)
         msrp = self.msrp
         msrp_session = self.msrp_session
         msrp_connector = self.msrp_connector
         try:
             if self.greenlet is not None:
                 api.kill(self.greenlet)
             if msrp_session is not None:
                 msrp_session.shutdown()
             elif msrp is not None:
                 msrp.loseConnection(wait=False)
             if msrp_connector is not None:
                 msrp_connector.cleanup()
         finally:
             notification_center.post_notification(
                 'MediaStreamDidEnd',
                 sender=self,
                 data=NotificationData(error=self._failure_reason))
             notification_center.remove_observer(self, sender=self)
             self.msrp = None
             self.msrp_session = None
             self.msrp_connector = None
             self.session = None
             self.greenlet = None
Пример #4
0
    def test_close_with_makefile(self):
        def accept_close_early(listener):
            # verify that the makefile and the socket are truly independent
            # by closing the socket prior to using the made file
            try:
                conn, addr = listener.accept()
                fd = conn.makeGreenFile()
                conn.close()
                fd.write('hello\n')
                fd.close()
                self.assertRaises(socket.error, fd.write, 'a')
                self.assertRaises(socket.error, conn.send, 'b')
            finally:
                listener.close()

        def accept_close_late(listener):
            # verify that the makefile and the socket are truly independent
            # by closing the made file and then sending a character
            try:
                conn, addr = listener.accept()
                fd = conn.makeGreenFile()
                fd.write('hello')
                fd.close()
                conn.send('\n')
                conn.close()
                self.assertRaises(socket.error, fd.write, 'a')
                self.assertRaises(socket.error, conn.send, 'b')
            finally:
                listener.close()

        def did_it_work(server):
            client = api.connect_tcp(('127.0.0.1', server.getsockname()[1]))
            fd = client.makeGreenFile()
            client.close()
            assert fd.readline() == b'hello\n'
            assert fd.read() == ''
            fd.close()

        server = api.tcp_listener(('0.0.0.0', 0))
        killer = api.spawn(accept_close_early, server)
        did_it_work(server)
        api.kill(killer)

        server = api.tcp_listener(('0.0.0.0', 0))
        killer = api.spawn(accept_close_late, server)
        did_it_work(server)
        api.kill(killer)
Пример #5
0
 def stop(self):
     if self.greenlet is not None:
         api.kill(self.greenlet, api.GreenletExit())
         self.greenlet = None
Пример #6
0
 def stop(self):
     if self.greenlet is not None:
         api.kill(self.greenlet, api.GreenletExit())
         self.greenlet = None
Пример #7
0
 def tearDown(self):
     api.kill(self.killer)
Пример #8
0
 def tearDown(self):
     self._cancel_timeout.cancel()
     api.kill(self.actor._killer)
Пример #9
0
 def tearDown(self):
     self.server.server_close()
     kill(self.gthread)
Пример #10
0
 def tearDown(self):
     api.kill(self.victim)