When running Twisted tests, failures are not reported

Bug #711209 reported by Julian Edwards
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Launchpad itself
Fix Released
Critical
Jonathan Lange

Bug Description

With this basic test case:

{{{
class TestBlah(TestCaseWithFactory):
    run_tests_with = AsynchronousDeferredRunTest.make_factory(timeout=10)
    def test_failing_test(self):
        self.assertFalse(True)
}}}

I don't see a failure reported. Tracing through the code in pdb I can produce a "AttributeError: "can't set attribute"" at the backtrace below:

  /home/ed/canonical/lp-branches/double-build-bug-705342/bin/test(275)<module>()
-> testrunner.run([])
  /home/ed/canonical/lp-sourcedeps/eggs/zope.testing-3.9.4_p3-py2.6.egg/zope/testing/testrunner/__init__.py(32)run()
-> failed = run_internal(defaults, args, script_parts=script_parts)
  /home/ed/canonical/lp-sourcedeps/eggs/zope.testing-3.9.4_p3-py2.6.egg/zope/testing/testrunner/__init__.py(45)run_internal()
-> runner.run()
  /home/ed/canonical/lp-sourcedeps/eggs/zope.testing-3.9.4_p3-py2.6.egg/zope/testing/testrunner/runner.py(138)run()
-> self.run_tests()
  /home/ed/canonical/lp-sourcedeps/eggs/zope.testing-3.9.4_p3-py2.6.egg/zope/testing/testrunner/runner.py(219)run_tests()
-> setup_layers, self.failures, self.errors)
  /home/ed/canonical/lp-sourcedeps/eggs/zope.testing-3.9.4_p3-py2.6.egg/zope/testing/testrunner/runner.py(377)run_layer()
-> return run_tests(options, tests, layer_name, failures, errors)
  /home/ed/canonical/lp-sourcedeps/eggs/zope.testing-3.9.4_p3-py2.6.egg/zope/testing/testrunner/runner.py(309)run_tests()
-> test(result)
  /usr/lib/python2.6/unittest.py(300)__call__()
-> return self.run(*args, **kwds)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/testcase.py(450)run()
-> return self.__RunTest(self, self.exception_handlers).run(result)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/runtest.py(74)run()
-> return self._run_one(actual_result)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/runtest.py(88)_run_one()
-> return self._run_prepared_result(ExtendedToOriginalDecorator(result))
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/runtest.py(100)_run_prepared_result()
-> self._run_core()
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/deferredruntest.py(226)_run_core()
-> self._blocking_run_deferred, spinner)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/deferredruntest.py(68)run_with_log_observers()
-> return function(*args, **kwargs)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/deferredruntest.py(208)_blocking_run_deferred()
-> spinner.run, self._timeout, self._run_deferred)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/_spinner.py(106)trap_unhandled_errors()
-> result = function(*args, **kwargs)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/_spinner.py(51)decorated()
-> return function(*args, **kwargs)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/_spinner.py(307)run()
-> self._reactor.run()
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/base.py(1157)run()
-> self.startRunning(installSignalHandlers=installSignalHandlers)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/base.py(1137)startRunning()
-> ReactorBase.startRunning(self)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/base.py(674)startRunning()
-> self.fireSystemEvent('startup')
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/base.py(628)fireSystemEvent()
-> event.fireEvent()
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/base.py(413)fireEvent()
-> DeferredList(beforeResults).addCallback(self._continueFiring)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(297)addCallback()
-> callbackKeywords=kw)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(286)addCallbacks()
-> self._runCallbacks()
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(542)_runCallbacks()
-> current.result = callback(current.result, *args, **kw)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/base.py(426)_continueFiring()
-> callable(*args, **kwargs)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/_spinner.py(302)run_function()
-> d = defer.maybeDeferred(function, *args, **kwargs)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(133)maybeDeferred()
-> result = f(*args, **kw)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/deferredruntest.py(194)_run_deferred()
-> d.addCallback(set_up_done)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(297)addCallback()
-> callbackKeywords=kw)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(286)addCallbacks()
-> self._runCallbacks()
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(542)_runCallbacks()
-> current.result = callback(current.result, *args, **kw)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/deferredruntest.py(182)set_up_done()
-> d = self._run_user(self.case._run_test_method, self.result)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/deferredruntest.py(262)_run_user()
-> return d.addErrback(self._got_user_failure)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(308)addErrback()
-> errbackKeywords=kw)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(286)addCallbacks()
-> self._runCallbacks()
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/internet/defer.py(542)_runCallbacks()
-> current.result = callback(current.result, *args, **kw)
  /home/ed/canonical/lp-sourcedeps/eggs/testtools-0.9.8-py2.6.egg/testtools/deferredruntest.py(46)_got_user_failure()
-> (failure.type, failure.value, failure.getTracebackObject()),
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/python/failure.py(466)getTracebackObject()
-> return _Traceback(self.frames)
  /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/python/failure.py(94)__init__()
-> self.tb_frame = _Frame(name, filename)
> /home/ed/canonical/lp-sourcedeps/eggs/Twisted-10.2.0_4395fix_1-py2.6-linux-x86_64.egg/twisted/python/failure.py(120)__init__()
-> self.f_locals = {}

AttributeError: "can't set attribute"

Related branches

Revision history for this message
Julian Edwards (julian-edwards) wrote :

This AttributeError appears to cause the code to not report the failure.

Revision history for this message
Jonathan Lange (jml) wrote :

Turns out this is due to bad interaction between the band-aid for bug 425113 and testtools.

affects: testtools → launchpad
Changed in launchpad:
status: New → Triaged
importance: Undecided → Critical
assignee: nobody → Jonathan Lange (jml)
status: Triaged → In Progress
Revision history for this message
Launchpad QA Bot (lpqabot) wrote :
Changed in launchpad:
milestone: none → 11.02
tags: added: qa-needstesting
Changed in launchpad:
status: In Progress → Fix Committed
tags: added: qa-untestable
removed: qa-needstesting
Jonathan Lange (jml)
Changed in launchpad:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.