Comment 1 for bug 425113

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

The failure is a combination of two bugs in Twisted.

The first is that Twisted's result adapter object passes a thing that looks like the result of sys.exc_info(), but isn't quite the same. Zope recently has come to rely on more features of the third value of that tuple; features that Trial doesn't provide.

At some point, Zope raises:
    AttributeError: "'_Frame' object has no attribute 'f_locals'"

Here's the pdb stack:

/home/jml/src/launchpad/ec2test-karmic-bug-424197/bin/test(219)?()
-> result = testrunner.run(defaults)
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/__init__.py(32)run()
-> failed = run_internal(defaults, args, script_parts=script_parts)
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/__init__.py(45)run_internal()
-> runner.run()
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/runner.py(136)run()
-> self.run_tests()
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/runner.py(216)run_tests()
-> setup_layers, self.failures, self.errors)
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/runner.py(374)run_layer()
-> return run_tests(options, tests, layer_name, failures, errors)
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/runner.py(306)run_tests()
-> test(result)
  /home/jml/src/launchpad/ec2test-karmic-bug-424197/lib/twisted/trial/unittest.py(632)__call__()
-> return self.run(*args, **kwargs)
  /home/jml/src/launchpad/ec2test-karmic-bug-424197/lib/twisted/trial/unittest.py(956)run()
-> d = self.deferSetUp(None, result)
  /home/jml/src/launchpad/ec2test-karmic-bug-424197/lib/twisted/trial/unittest.py(659)deferSetUp()
-> errbackArgs=(result,))
  /home/jml/src/launchpad/package-permission-love/lib/twisted/internet/defer.py(186)addCallbacks()
-> self._runCallbacks()
  /home/jml/src/launchpad/package-permission-love/lib/twisted/internet/defer.py(328)_runCallbacks()
-> self.result = callback(self.result, *args, **kw)
  /home/jml/src/launchpad/ec2test-karmic-bug-424197/lib/twisted/trial/unittest.py(675)deferTestMethod()
-> errbackArgs=(result,))
  /home/jml/src/launchpad/package-permission-love/lib/twisted/internet/defer.py(186)addCallbacks()
-> self._runCallbacks()
  /home/jml/src/launchpad/package-permission-love/lib/twisted/internet/defer.py(328)_runCallbacks()
-> self.result = callback(self.result, *args, **kw)
  /home/jml/src/launchpad/ec2test-karmic-bug-424197/lib/twisted/trial/unittest.py(694)_ebDeferTestMethod()
-> result.addFailure(self, f)
  /home/jml/src/launchpad/ec2test-karmic-bug-424197/lib/twisted/trial/unittest.py(1162)addFailure()
-> self.original.addFailure(test, self._exc_info(fail))
> /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/runner.py(714)addFailure()
-> exc_info)
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/formatter.py(319)test_failure()
-> self.print_traceback("Failure in test %s" % test, exc_info)
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/formatter.py(570)print_traceback()
-> tb = self.format_traceback(exc_info)
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/formatter.py(343)format_traceback()
-> tb = "".join(traceback.format_exception(*exc_info))
  /home/jml/repos/lp-sourcedeps/eggs/zope.testing-3.8.1-py2.4.egg/zope/testing/testrunner/tb_format.py(30)format_exception()
-> return fmt.formatException(t, v, tb)
  /home/jml/repos/lp-sourcedeps/eggs/zope.exceptions-3.5.2-py2.4.egg/zope/exceptions/exceptionformatter.py(174)formatException()
-> if tb.tb_frame.f_locals.get('__exception_formatter__'):

The other bug is the linked bug, Trial swallows any errors that occur in the test result object (which is where the error is occurring).

For Launchpad's purposes, we need to improve Trial's test result adapter to be good enough to fake sys.exc_info() for Zope.