"""
implements(IReactorTime, IReactorFDSet)
- def __init__(self, ioloop):
+ def __init__(self, ioloop=None):
if not ioloop:
ioloop = tornado.ioloop.IOLoop.instance()
self._ioloop = ioloop
self._fds = {} # a map of fd to a (reader, writer) tuple
self._delayedCalls = {}
self._running = False
+ self._closed = False
PosixReactorBase.__init__(self)
# IReactorTime
fd = reader.fileno()
if reader in self._readers:
del self._readers[reader]
+ if self._closed: return
(_, writer) = self._fds[fd]
if writer:
# We have a writer so we need to update the IOLoop for
fd = writer.fileno()
if writer in self._writers:
del self._writers[writer]
+ if self._closed: return
(reader, _) = self._fds[fd]
if reader:
# We have a reader so we need to update the IOLoop for
except:
# Ignore any exceptions thrown by IOLoop
pass
+ self._closed = True
def crash(self):
if not self._running:
except:
# Ignore any exceptions thrown by IOLoop
pass
+ self._closed = True
def doIteration(self, delay):
raise NotImplementedError("doIteration")
self._running = True
self._ioloop.start()
+class _TestReactor(TornadoReactor):
+ """Subclass of TornadoReactor for use in unittests.
+
+ This can't go in the test.py file because of import-order dependencies
+ with the twisted reactor test builder.
+ """
+ def __init__(self):
+ # always use a new ioloop
+ super(_TestReactor, self).__init__(IOLoop())
+
+ def listenTCP(self, port, factory, backlog=50, interface=''):
+ # default to localhost to avoid firewall prompts on the mac
+ if not interface:
+ interface = '127.0.0.1'
+ return super(_TestReactor, self).listenTCP(
+ port, factory, backlog=backlog, interface=interface)
+
+
+
def install(ioloop=None):
"""
Install the Tornado reactor.
from tornado.ioloop import IOLoop
from tornado.platform.auto import set_close_exec
+from tornado.util import import_object
class ReactorWhenRunningTest(unittest.TestCase):
def setUp(self):
del ReactorCallFromThreadTest
del ReactorCallInThread
del ReactorReaderWriterTest
+else:
+ # Import and run as much of twisted's test suite as possible.
+ # This is unfortunately rather dependent on implementation details,
+ # but there doesn't appear to be a clean all-in-one conformance test
+ # suite for reactors.
+ # This is a list of all test suites using the ReactorBuilder
+ # available in Twisted 11.0.0. Tests that do not currently pass
+ # with the TornadoReactor are commented out.
+ twisted_tests = [
+ 'twisted.internet.test.test_core.ObjectModelIntegrationTest',
+ #'twisted.internet.test.test_core.SystemEventTestsBuilder',
+ 'twisted.internet.test.test_fdset.ReactorFDSetTestsBuilder',
+ #'twisted.internet.test.test_process.ProcessTestsBuilder',
+ #'twisted.internet.test.test_process.PTYProcessTestsBuilder',
+ #'twisted.internet.test.test_tcp.TCPClientTestsBuilder',
+ 'twisted.internet.test.test_tcp.TCPPortTestsBuilder',
+ 'twisted.internet.test.test_tcp.TCPConnectionTestsBuilder',
+ 'twisted.internet.test.test_threads.ThreadTestsBuilder',
+ 'twisted.internet.test.test_time.TimeTestsBuilder',
+ #'twisted.internet.test.test_tls.SSLClientTestsMixin',
+ 'twisted.internet.test.test_udp.UDPServerTestsBuilder',
+ #'twisted.internet.test.test_unix.UNIXTestsBuilder',
+ #'twisted.internet.test.test_unix.UNIXDatagramTestsBuilder',
+ ]
+ for test_name in twisted_tests:
+ try:
+ test = import_object(test_name)
+ except (ImportError, AttributeError):
+ continue
+ class TornadoTest(test):
+ _reactors = ["tornado.platform.twistedreactor._TestReactor"]
+ TornadoTest.__name__ = test.__name__
+ globals().update(TornadoTest.makeTestCaseClasses())
if __name__ == "__main__":
unittest.main()