SVN: zope.testing/trunk/src/zope/testing/testrunner/ added missing test for post mortem debugging in StartUpFailure

Michael Howitz <[email protected]>
Newsgroups gmane.comp.web.zope.zope3.cvs
Message-ID <20080813082159.70B0539635__34506.5546840944$1218615812$gmane$org@cvs.zope.org>
Log message for revision 89786:
  added missing test for post mortem debugging in StartUpFailure
  

Changed:
  A   zope.testing/trunk/src/zope/testing/testrunner/debug.py
  U   zope.testing/trunk/src/zope/testing/testrunner/find.py
  U   zope.testing/trunk/src/zope/testing/testrunner/interfaces.py
  U   zope.testing/trunk/src/zope/testing/testrunner/runner.py
  U   zope.testing/trunk/src/zope/testing/testrunner/tests.py

-=-
Copied: zope.testing/trunk/src/zope/testing/testrunner/debug.py (from rev 89785, zope.testing/trunk/src/zope/testing/testrunner/runner.py)
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner/debug.py	                        (rev 0)
+++ zope.testing/trunk/src/zope/testing/testrunner/debug.py	2008-08-13 08:21:57 UTC (rev 89786)
@@ -0,0 +1,60 @@
+##############################################################################
+#
+# Copyright (c) 2004-2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Debug functions
+
+$Id: __init__.py 86232 2008-05-03 15:09:33Z ctheune $
+
+"""
+
+import sys
+import pdb
+
+from zope.testing import doctest
+import zope.testing.testrunner.interfaces
+
+
+def post_mortem(exc_info):
+    err = exc_info[1]
+    if isinstance(err, (doctest.UnexpectedException, doctest.DocTestFailure)):
+
+        if isinstance(err, doctest.UnexpectedException):
+            exc_info = err.exc_info
+
+            # Print out location info if the error was in a doctest
+            if exc_info[2].tb_frame.f_code.co_filename == '<string>':
+                print_doctest_location(err)
+
+        else:
+            print_doctest_location(err)
+            # Hm, we have a DocTestFailure exception.  We need to
+            # generate our own traceback
+            try:
+                exec ('raise ValueError'
+                      '("Expected and actual output are different")'
+                      ) in err.test.globs
+            except:
+                exc_info = sys.exc_info()
+
+    print "%s:" % (exc_info[0], )
+    print exc_info[1]
+    pdb.post_mortem(exc_info[2])
+    raise zope.testing.testrunner.interfaces.EndRun()
+
+
+def print_doctest_location(err):
+    # This mimics pdb's output, which gives way cool results in emacs :)
+    filename = err.test.filename
+    if filename.endswith('.pyc'):
+        filename = filename[:-1]
+    print "> %s(%s)_()" % (filename, err.test.lineno+err.example.lineno+1)

Modified: zope.testing/trunk/src/zope/testing/testrunner/find.py
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner/find.py	2008-08-13 06:22:15 UTC (rev 89785)
+++ zope.testing/trunk/src/zope/testing/testrunner/find.py	2008-08-13 08:21:57 UTC (rev 89786)
@@ -23,21 +23,59 @@
 
 import zope.testing.testrunner.feature
 import zope.testing.testrunner.layer
+import zope.testing.testrunner.debug
 
 identifier = re.compile(r'[_a-zA-Z]\w*$').match
 
 
 class StartUpFailure(unittest.TestCase):
-    """Empty test case added to the test suite to indicate import failures."""
+    """Empty test case added to the test suite to indicate import failures.
 
+    >>> class Options(object):
+    ...    post_mortem = False
+    >>> options = Options()
+    
+    Normally the StartUpFailure just acts as an emtpy test suite to satisfy
+    the test runner and statistics:
+    
+    >>> StartUpFailure(options, None, None)
+    <StartUpFailure module=None>
+
+    The post mortem debugger needs real exception information:
+
+    >>> import sys
+    >>> try:
+    ...    raise Exception()
+    ... except:
+    ...     exc_info = sys.exc_info()
+
+    If the post mortem option is enabled the StartUpFailure will start
+    the debugger and stop the test run after the debugger quits:
+
+    >>> from zope.testing.testrunner.runner import FakeInputContinueGenerator
+    >>> old_stdin = sys.stdin
+
+    >>> options.post_mortem = True
+    >>> sys.stdin = FakeInputContinueGenerator()
+    >>> try:
+    ...     StartUpFailure(options, None, exc_info)
+    ... finally:
+    ...    sys.stdin = old_stdin
+    Traceback (most recent call last):
+    EndRun
+
+    """
+
     def __init__(self, options, module, exc_info):
         if options.post_mortem:
-            from zope.testing.testrunner.runner import post_mortem
-            post_mortem(exc_info)
+            zope.testing.testrunner.debug.post_mortem(exc_info)
         self.module = module
         self.exc_info = exc_info
 
+    def __repr__(self):
+        return '<StartUpFailure module=%s>' % self.module
 
+
 def find_tests(options, found_suites=None):
     """Creates a dictionary mapping layer name to a suite of tests to be run
     in that layer.

Modified: zope.testing/trunk/src/zope/testing/testrunner/interfaces.py
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner/interfaces.py	2008-08-13 06:22:15 UTC (rev 89785)
+++ zope.testing/trunk/src/zope/testing/testrunner/interfaces.py	2008-08-13 08:21:57 UTC (rev 89786)
@@ -23,6 +23,14 @@
 import zope.interface
 
 
+class EndRun(Exception):
+    """Indicate that the existing run call should stop
+
+    Used to prevent additional test output after post-mortem debugging.
+
+    """
+
+
 class IFeature(zope.interface.Interface):
     """Features extend the test runners functionality in a pipe-lined
     order.

Modified: zope.testing/trunk/src/zope/testing/testrunner/runner.py
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner/runner.py	2008-08-13 06:22:15 UTC (rev 89785)
+++ zope.testing/trunk/src/zope/testing/testrunner/runner.py	2008-08-13 08:21:57 UTC (rev 89786)
@@ -20,7 +20,6 @@
 import gc
 import glob
 import os
-import pdb
 import re
 import sys
 import tempfile
@@ -45,8 +44,9 @@
 import zope.testing.testrunner.listing
 import zope.testing.testrunner.statistics
 import zope.testing.testrunner.subprocess
+import zope.testing.testrunner.interfaces
+import zope.testing.testrunner.debug
 
-
 PYREFCOUNT_PATTERN = re.compile('\[[0-9]+ refs\]')
 
 
@@ -66,14 +66,6 @@
     "Couldn't tear down a test"
 
 
-class EndRun(Exception):
-    """Indicate that the existing run call should stop
-
-    Used to prevent additional test output after post-mortem debugging.
-
-    """
-
-
 class Runner(object):
     """The test runner.
 
@@ -214,7 +206,7 @@
             try:
                 self.ran += run_layer(self.options, layer_name, layer, tests,
                                       setup_layers, self.failures, self.errors)
-            except EndRun:
+            except zope.testing.testrunner.interfaces.EndRun:
                 self.failed = True
                 return
             except CanNotTearDown:
@@ -353,7 +345,7 @@
 
     try:
         setup_layer(options, layer, setup_layers)
-    except EndRun:
+    except zope.testing.testrunner.interfaces.EndRun:
         raise
     except Exception:
         f = cStringIO.StringIO()
@@ -537,7 +529,8 @@
                             % options.resume_layer)
                         raise
                     else:
-                        post_mortem(sys.exc_info())
+                        zope.testing.testrunner.debug.post_mortem(
+                            sys.exc_info())
                 else:
                     raise
 
@@ -608,7 +601,7 @@
                                                       " when running a layer"
                                                       " as a subprocess!")
             else:
-                post_mortem(exc_info)
+                zope.testing.testrunner.debug.post_mortem(exc_info)
 
     def addFailure(self, test, exc_info):
         self.options.output.test_failure(test, time.time() - self._start_time,
@@ -619,7 +612,7 @@
         if self.options.post_mortem:
             # XXX: mgedmin: why isn't there a resume_layer check here like
             # in addError?
-            post_mortem(exc_info)
+            zope.testing.testrunner.debug.post_mortem(exc_info)
 
     def stopTest(self, test):
         self.testTearDown()
@@ -690,42 +683,6 @@
         gather_layers(b, result)
 
 
-def post_mortem(exc_info):
-    err = exc_info[1]
-    if isinstance(err, (doctest.UnexpectedException, doctest.DocTestFailure)):
-
-        if isinstance(err, doctest.UnexpectedException):
-            exc_info = err.exc_info
-
-            # Print out location info if the error was in a doctest
-            if exc_info[2].tb_frame.f_code.co_filename == '<string>':
-                print_doctest_location(err)
-
-        else:
-            print_doctest_location(err)
-            # Hm, we have a DocTestFailure exception.  We need to
-            # generate our own traceback
-            try:
-                exec ('raise ValueError'
-                      '("Expected and actual output are different")'
-                      ) in err.test.globs
-            except:
-                exc_info = sys.exc_info()
-
-    print "%s:" % (exc_info[0], )
-    print exc_info[1]
-    pdb.post_mortem(exc_info[2])
-    raise EndRun
-
-
-def print_doctest_location(err):
-    # This mimics pdb's output, which gives way cool results in emacs :)
-    filename = err.test.filename
-    if filename.endswith('.pyc'):
-        filename = filename[:-1]
-    print "> %s(%s)_()" % (filename, err.test.lineno+err.example.lineno+1)
-
-
 class FakeInputContinueGenerator:
 
     def readline(self):

Modified: zope.testing/trunk/src/zope/testing/testrunner/tests.py
===================================================================
--- zope.testing/trunk/src/zope/testing/testrunner/tests.py	2008-08-13 06:22:15 UTC (rev 89785)
+++ zope.testing/trunk/src/zope/testing/testrunner/tests.py	2008-08-13 08:21:57 UTC (rev 89786)
@@ -109,7 +109,8 @@
         checker=checker),
         doctest.DocTestSuite('zope.testing.testrunner'),
         doctest.DocTestSuite('zope.testing.testrunner.coverage'),
-        doctest.DocTestSuite('zope.testing.testrunner.options')
+        doctest.DocTestSuite('zope.testing.testrunner.options'),
+        doctest.DocTestSuite('zope.testing.testrunner.find'),
         ]
 
     if sys.platform == 'win32':
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.