zturner created this revision.
zturner added reviewers: clayborg, spyffe.
zturner added a subscriber: lldb-commits.
There is a certain class of test failures that arise as a result of errors that
occur during cleanup. For the most part, these don't indicate test failures
and so it's useful to distinguish them from test failures. This patch creates
a new category of error, called a CleanupError, that is handled (and reported)
independently of whether or not any individual tests failed.
This is especially important when there is a directory that contains multiple
test suites, because previously a cleanup error on the first suite would
automatically cause subsequent suites in the same directory to not run, as a
result of exception propagation.
http://reviews.llvm.org/D12327
Files:
test/dotest.py
test/lldbtest.py
test/unittest2/case.py
test/unittest2/result.py
Index: test/unittest2/result.py
===================================================================
--- test/unittest2/result.py
+++ test/unittest2/result.py
@@ -42,6 +42,7 @@
self.failures = []
self.passes = []
self.errors = []
+ self.cleanup_errors = []
self.testsRun = 0
self.skipped = []
self.expectedFailures = []
@@ -109,6 +110,13 @@
self.errors.append((test, self._exc_info_to_string(err, test)))
self._mirrorOutput = True
+ def addCleanupError(self, test, err):
+ """Called when an error has occurred during cleanup. 'err' is a tuple of
+ values as returned by sys.exc_info().
+ """
+ self.cleanup_errors.append((test, self._exc_info_to_string(err, test)))
+ self._mirrorOutput = True
+
@failfast
def addFailure(self, test, err):
"""Called when an error has occurred. 'err' is a tuple of values as
Index: test/unittest2/case.py
===================================================================
--- test/unittest2/case.py
+++ test/unittest2/case.py
@@ -383,9 +383,11 @@
try:
self.tearDown()
except Exception:
- result.addError(self, sys.exc_info())
+ result.addCleanupError(self, sys.exc_info())
success = False
+ self.dumpSessionInfo()
+
cleanUpSuccess = self.doCleanups()
success = success and cleanUpSuccess
if success:
Index: test/lldbtest.py
===================================================================
--- test/lldbtest.py
+++ test/lldbtest.py
@@ -1195,8 +1195,7 @@
if doCleanup and not lldb.skip_build_and_cleanup:
# First, let's do the platform-specific cleanup.
module = builder_module()
- if not module.cleanup():
- raise Exception("Don't know how to do cleanup")
+ module.cleanup()
# Subclass might have specific cleanup function defined.
if getattr(cls, "classCleanup", None):
@@ -1385,6 +1384,7 @@
# initially. If the test errored/failed, the session info
# (self.session) is then dumped into a session specific file for
# diagnosis.
+ self.__cleanup_errored__ = False
self.__errored__ = False
self.__failed__ = False
self.__expected__ = False
@@ -1616,9 +1616,6 @@
self.disableLogChannelsForCurrentTest()
- # Decide whether to dump the session info.
- self.dumpSessionInfo()
-
# =========================================================
# Various callbacks to allow introspection of test progress
# =========================================================
@@ -1631,6 +1628,14 @@
# Once by the Python unittest framework, and a second time by us.
print >> sbuf, "ERROR"
+ def markCleanupError(self):
+ """Callback invoked when an error occurs while a test is cleaning up."""
+ self.__cleanup_errored__ = True
+ with recording(self, False) as sbuf:
+ # False because there's no need to write "CLEANUP_ERROR" to the stderr twice.
+ # Once by the Python unittest framework, and a second time by us.
+ print >> sbuf, "CLEANUP_ERROR"
+
def markFailure(self):
"""Callback invoked when a failure (test assertion failure) occurred."""
self.__failed__ = True
@@ -1729,6 +1734,9 @@
if self.__errored__:
pairs = lldb.test_result.errors
prefix = 'Error'
+ if self.__cleanup_errored__:
+ pairs = lldb.test_result.cleanup_errors
+ prefix = 'CleanupError'
elif self.__failed__:
pairs = lldb.test_result.failures
prefix = 'Failure'
Index: test/dotest.py
===================================================================
--- test/dotest.py
+++ test/dotest.py
@@ -1685,6 +1685,17 @@
if parsable:
self.stream.write("FAIL: LLDB (%s) :: %s\n" % (self._config_string(test), str(test)))
+ def addCleanupError(self, test, err):
+ global sdir_has_content
+ global parsable
+ sdir_has_content = True
+ super(LLDBTestResult, self).addCleanupError(test, err)
+ method = getattr(test, "markCleanupError", None)
+ if method:
+ method()
+ if parsable:
+ self.stream.write("CLEANUP ERROR: LLDB (%s) :: %s\n" % (self._config_string(test), str(test)))
+
def addFailure(self, test, err):
global sdir_has_content
global failuresPerCategory
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits