1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
import unittest
from glusto.core import Glusto as g
class BaseClass(unittest.TestCase):
ERROR_OR_FAILURE_EXISTS = False
STOP_ON_FIRST_FAILURE = bool(g.config.get("common", {}).get(
"stop_on_first_failure", False))
def setUp(self):
if (BaseClass.STOP_ON_FIRST_FAILURE and
BaseClass.ERROR_OR_FAILURE_EXISTS):
self.skipTest("Test is skipped, because of the restriction "
"to one test case failure.")
return super(BaseClass, self).setUp()
def _is_error_or_failure_exists(self):
if hasattr(self, '_outcome'):
# Python 3.4+
result = self.defaultTestResult()
self._feedErrorsToResult(result, self._outcome.errors)
else:
# Python 2.7-3.3
result = getattr(
self, '_outcomeForDoCleanups', self._resultForDoCleanups)
ok_result = True
for attr in ('errors', 'failures'):
if not hasattr(result, attr):
continue
exc_list = getattr(result, attr)
if exc_list and exc_list[-1][0] is self:
ok_result = ok_result and not exc_list[-1][1]
if hasattr(result, '_excinfo'):
ok_result = ok_result and not result._excinfo
if ok_result:
return False
self.ERROR_OR_FAILURE_EXISTS = True
BaseClass.ERROR_OR_FAILURE_EXISTS = True
return True
def doCleanups(self):
if (BaseClass.STOP_ON_FIRST_FAILURE and (
self.ERROR_OR_FAILURE_EXISTS or
self._is_error_or_failure_exists())):
while self._cleanups:
(func, args, kwargs) = self._cleanups.pop()
msg = ("Found test case failure. Avoiding run of scheduled "
"following cleanup:\nfunc = %s\nargs = %s\n"
"kwargs = %s" % (func, args, kwargs))
g.log.warn(msg)
return super(BaseClass, self).doCleanups()
@classmethod
def doClassCleanups(cls):
if (BaseClass.STOP_ON_FIRST_FAILURE and
BaseClass.ERROR_OR_FAILURE_EXISTS):
while cls._class_cleanups:
(func, args, kwargs) = cls._class_cleanups.pop()
msg = ("Found test case failure. Avoiding run of scheduled "
"following cleanup:\nfunc = %s\nargs = %s\n"
"kwargs = %s" % (func, args, kwargs))
g.log.warn(msg)
return super(BaseClass, cls).doClassCleanups()
|