Handle skips when running on python2.6.
authorJelmer Vernooij <jelmer@samba.org>
Wed, 4 Feb 2015 15:40:29 +0000 (16:40 +0100)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 6 Mar 2015 03:41:49 +0000 (04:41 +0100)
Change-Id: I8b0a15760a72f41800d23150232c2b0e59e32c32
Signed-off-by: Jelmer Vernooij <jelmer@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/tests/__init__.py

index 99cea490a1c2c6824d984ad40c1fc13713239402..9c82abd66813d40df7495f922ca646e533c4ec4a 100644 (file)
@@ -25,6 +25,7 @@ from samba import param
 from samba.samdb import SamDB
 from samba import credentials
 import subprocess
+import sys
 import tempfile
 import unittest
 
@@ -54,32 +55,79 @@ class TestCase(unittest.TestCase):
         return cmdline_credentials
 
     # These functions didn't exist before Python2.7:
-    if not getattr(unittest.TestCase, "skipTest", None):
+    if sys.version_info < (2, 7):
+        import warnings
+
         def skipTest(self, reason):
             raise SkipTest(reason)
 
-    if not getattr(unittest.TestCase, "assertIs", None):
         def assertIs(self, a, b):
             self.assertTrue(a is b)
 
-    if not getattr(unittest.TestCase, "assertIsNot", None):
         def assertIsNot(self, a, b):
             self.assertTrue(a is not b)
 
-    if not getattr(unittest.TestCase, "assertIsInstance", None):
         def assertIsInstance(self, a, b):
             self.assertTrue(isinstance(a, b))
 
-    if not getattr(unittest.TestCase, "addCleanup", None):
         def addCleanup(self, fn, *args, **kwargs):
             self._cleanups = getattr(self, "_cleanups", []) + [
                 (fn, args, kwargs)]
 
+        def _addSkip(self, result, reason):
+            addSkip = getattr(result, 'addSkip', None)
+            if addSkip is not None:
+                addSkip(self, reason)
+            else:
+                warnings.warn("TestResult has no addSkip method, skips not reported",
+                              RuntimeWarning, 2)
+                result.addSuccess(self)
+
         def run(self, result=None):
-            ret = super(TestCase, self).run(result=result)
-            for (fn, args, kwargs) in reversed(getattr(self, "_cleanups", [])):
-                fn(*args, **kwargs)
-            return ret
+            if result is None: result = self.defaultTestResult()
+            result.startTest(self)
+            testMethod = getattr(self, self._testMethodName)
+            try:
+                try:
+                    self.setUp()
+                except SkipTest, e:
+                    self._addSkip(result, str(e))
+                    return
+                except KeyboardInterrupt:
+                    raise
+                except:
+                    result.addError(self, self._exc_info())
+                    return
+
+                ok = False
+                try:
+                    testMethod()
+                    ok = True
+                except SkipTest, e:
+                    self._addSkip(result, str(e))
+                    return
+                except self.failureException:
+                    result.addFailure(self, self._exc_info())
+                except KeyboardInterrupt:
+                    raise
+                except:
+                    result.addError(self, self._exc_info())
+
+                try:
+                    self.tearDown()
+                except SkipTest, e:
+                    self._addSkip(result, str(e))
+                except KeyboardInterrupt:
+                    raise
+                except:
+                    result.addError(self, self._exc_info())
+                    ok = False
+
+                for (fn, args, kwargs) in reversed(getattr(self, "_cleanups", [])):
+                    fn(*args, **kwargs)
+                if ok: result.addSuccess(self)
+            finally:
+                result.stopTest(self)
 
 
 class LdbTestCase(TestCase):