def checkReactor(self, phase, *_): delayed_calls = reactor.getDelayedCalls() if delayed_calls: self._logger.error("The reactor was dirty during %s:", phase) for dc in delayed_calls: self._logger.error("> %s" % dc) dc.cancel() has_network_selectables = False for item in reactor.getReaders() + reactor.getWriters(): if isinstance(item, HTTPChannel) or isinstance(item, Client): has_network_selectables = True break if has_network_selectables: # TODO(Martijn): we wait a while before we continue the check since network selectables # might take some time to cleanup. I'm not sure what's causing this. yield deferLater(reactor, 0.2, lambda: None) # This is the same check as in the _cleanReactor method of Twisted's Trial selectable_strings = [] for sel in reactor.removeAll(): if interfaces.IProcessTransport.providedBy(sel): self._logger.error("Sending kill signal to %s", repr(sel)) sel.signalProcess('KILL') selectable_strings.append(repr(sel)) self.assertFalse(delayed_calls, "The reactor was dirty during %s" % phase) if Session.has_instance(): try: yield Session.get_instance().shutdown() except: pass Session.del_instance() raise RuntimeError("Found a leftover session instance during %s" % phase) self.assertFalse( selectable_strings, "The reactor has leftover readers/writers during %s: %r" % (phase, selectable_strings)) # Check whether we have closed all the sockets open_readers = reactor.getReaders() for reader in open_readers: self.assertNotIsInstance( reader, BasePort, "Listening ports left on the reactor during %s: %s" % (phase, reader)) # Check whether the threadpool is clean self.assertFalse(reactor.getThreadPool().working)
def __main__(): """ Run Tribler and check if the reactor is dirty when shutting down. This method is also called from tribler_exe.py. """ run() delayed_calls = reactor.getDelayedCalls() if delayed_calls: print >> sys.stderr, "The reactor was not clean after stopping:" for dc in delayed_calls: print >> sys.stderr, "> %s" % dc stop_reactor()
def tearDown(self, annotate=True): self.tearDownCleanup() if annotate: self.annotate(self._testMethodName, start=False) delayed_calls = reactor.getDelayedCalls() if delayed_calls: self._logger.error("The reactor was dirty:") for dc in delayed_calls: self._logger.error("> %s" % dc) self.assertFalse(delayed_calls, "The reactor was dirty when tearing down the test") self.assertFalse(Session.has_instance(), 'A session instance is still present when tearing down the test') process_unhandled_exceptions() self.watchdog.join()