aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKlement Sekera <ksekera@cisco.com>2018-06-22 13:19:45 +0200
committerKlement Sekera <ksekera@cisco.com>2018-06-25 14:19:57 +0200
commit4c5422ee52960fa151611aa94a76e363e1be98bd (patch)
tree8cb20a42b828d34a9290db71dc4108fb966af8d2
parentbeaded5e0cbcd507fa4dca4f71712bd4e6911e69 (diff)
make test: fix RETRIES when setUpClass throws
This change adds handling of special case when setUpClass throws. In this case TestResults receives a mock object called _ErrorHolder. By parsing its description, we find test class name and use it to lookup the test class in test suite to be able to add it to the list of failures for re-running. Change-Id: I656f21e38aa450fc567cdcbcf6e586967f947a64 Signed-off-by: Klement Sekera <ksekera@cisco.com>
-rw-r--r--test/framework.py22
-rw-r--r--test/run_tests.py5
2 files changed, 25 insertions, 2 deletions
diff --git a/test/framework.py b/test/framework.py
index dd4774dc72b..fdaba2b84d9 100644
--- a/test/framework.py
+++ b/test/framework.py
@@ -957,7 +957,25 @@ class VppTestResult(unittest.TestResult):
if hasattr(self, 'test_framework_failed_pipe'):
pipe = self.test_framework_failed_pipe
if pipe:
- pipe.send(test.__class__)
+ if test.__class__.__name__ == "_ErrorHolder":
+ x = str(test)
+ if x.startswith("setUpClass"):
+ # x looks like setUpClass (test_function.test_class)
+ cls = x.split(".")[1].split(")")[0]
+ for t in self.test_suite:
+ if t.__class__.__name__ == cls:
+ pipe.send(t.__class__)
+ break
+ else:
+ raise Exception("Can't find class name `%s' "
+ "(from ErrorHolder) in test suite "
+ "`%s'" % (cls, self.test_suite))
+ else:
+ raise Exception("FIXME: unexpected special case - "
+ "ErrorHolder description is `%s'" %
+ str(test))
+ else:
+ pipe.send(test.__class__)
def addFailure(self, test, err):
"""
@@ -1192,6 +1210,8 @@ class VppTestRunner(unittest.TextTestRunner):
filtered.countTestCases(), test.countTestCases()))
if not running_extended_tests():
print("Not running extended tests (some tests will be skipped)")
+ # super-ugly hack #2
+ VppTestResult.test_suite = filtered
return super(VppTestRunner, self).run(filtered)
diff --git a/test/run_tests.py b/test/run_tests.py
index 3476ef04668..c21acab2da5 100644
--- a/test/run_tests.py
+++ b/test/run_tests.py
@@ -52,7 +52,10 @@ class Filter_by_class_list:
def suite_from_failed(suite, failed):
filter_cb = Filter_by_class_list(failed)
- return VppTestRunner.filter_tests(suite, filter_cb)
+ suite = VppTestRunner.filter_tests(suite, filter_cb)
+ if 0 == suite.countTestCases():
+ raise Exception("Suite is empty after filtering out the failed tests!")
+ return suite
def run_forked(suite):