xref: /aosp_15_r20/external/autotest/tko/parsers/test/unittest_hotfix.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Lint as: python2, python3
2*9c5db199SXin Li"""Monkey patch lame-o vanilla unittest with test skip feature.
3*9c5db199SXin Li
4*9c5db199SXin LiFrom the patch that was never applied (shameful!):
5*9c5db199SXin Lihttp://bugs.python.org/issue1034053
6*9c5db199SXin Li"""
7*9c5db199SXin Li
8*9c5db199SXin Lifrom __future__ import absolute_import
9*9c5db199SXin Lifrom __future__ import division
10*9c5db199SXin Lifrom __future__ import print_function
11*9c5db199SXin Liimport time, unittest
12*9c5db199SXin Lifrom six.moves import map
13*9c5db199SXin Li
14*9c5db199SXin Li
15*9c5db199SXin Liclass SkipException(Exception):
16*9c5db199SXin Li    pass
17*9c5db199SXin Li
18*9c5db199SXin Li
19*9c5db199SXin Lidef TestResult__init__(self):
20*9c5db199SXin Li    self.failures = []
21*9c5db199SXin Li    self.errors = []
22*9c5db199SXin Li    self.skipped = []
23*9c5db199SXin Li    self.testsRun = 0
24*9c5db199SXin Li    self.shouldStop = 0
25*9c5db199SXin Li
26*9c5db199SXin Liunittest.TestResult.__init__ = TestResult__init__
27*9c5db199SXin Li
28*9c5db199SXin Li
29*9c5db199SXin Lidef TestResult_addSkipped(self, test, err):
30*9c5db199SXin Li    """Called when a test is skipped.
31*9c5db199SXin Li
32*9c5db199SXin Li    'err' is a tuple of values as returned by sys.exc_info().
33*9c5db199SXin Li    """
34*9c5db199SXin Li    self.skipped.append((test, str(err[1])))
35*9c5db199SXin Li
36*9c5db199SXin Liunittest.TestResult.addSkipped = TestResult_addSkipped
37*9c5db199SXin Li
38*9c5db199SXin Li
39*9c5db199SXin Lidef TestResult__repr__(self):
40*9c5db199SXin Li    return "<%s run=%i errors=%i failures=%i skipped=%i>" % (
41*9c5db199SXin Li        unittest._strclass(self.__class__), self.testsRun,
42*9c5db199SXin Li        len(self.errors), len(self.failures), len(self.skipped))
43*9c5db199SXin Li
44*9c5db199SXin Liunittest.TestResult.__repr__ = TestResult__repr__
45*9c5db199SXin Li
46*9c5db199SXin Li
47*9c5db199SXin Liclass TestCase(unittest.TestCase):
48*9c5db199SXin Li    # Yuck, all of run has to be copied for this.
49*9c5db199SXin Li    # I don't care about wrapping setUp atm.
50*9c5db199SXin Li    def run(self, result=None):
51*9c5db199SXin Li        if result is None: result = self.defaultTestResult()
52*9c5db199SXin Li        result.startTest(self)
53*9c5db199SXin Li        # Support variable naming differences between 2.4 and 2.6
54*9c5db199SXin Li        # Yay for silly variable hiding
55*9c5db199SXin Li        try:
56*9c5db199SXin Li            testMethodName = self.__testMethodName
57*9c5db199SXin Li            exc_info = self.__exc_info
58*9c5db199SXin Li        except AttributeError:
59*9c5db199SXin Li            testMethodName = self._testMethodName
60*9c5db199SXin Li            exc_info = self._exc_info
61*9c5db199SXin Li
62*9c5db199SXin Li        testMethod = getattr(self, testMethodName)
63*9c5db199SXin Li
64*9c5db199SXin Li        try:
65*9c5db199SXin Li            try:
66*9c5db199SXin Li                self.setUp()
67*9c5db199SXin Li            except KeyboardInterrupt:
68*9c5db199SXin Li                raise
69*9c5db199SXin Li            except:
70*9c5db199SXin Li                result.addError(self, exc_info())
71*9c5db199SXin Li                return
72*9c5db199SXin Li
73*9c5db199SXin Li            ok = False
74*9c5db199SXin Li            try:
75*9c5db199SXin Li                testMethod()
76*9c5db199SXin Li                ok = True
77*9c5db199SXin Li            except self.failureException:
78*9c5db199SXin Li                result.addFailure(self, exc_info())
79*9c5db199SXin Li            except SkipException:
80*9c5db199SXin Li                result.addSkipped(self, exc_info())
81*9c5db199SXin Li            except KeyboardInterrupt:
82*9c5db199SXin Li                raise
83*9c5db199SXin Li            except:
84*9c5db199SXin Li                result.addError(self, exc_info())
85*9c5db199SXin Li
86*9c5db199SXin Li            try:
87*9c5db199SXin Li                self.tearDown()
88*9c5db199SXin Li            except KeyboardInterrupt:
89*9c5db199SXin Li                raise
90*9c5db199SXin Li            except:
91*9c5db199SXin Li                result.addError(self, exc_info())
92*9c5db199SXin Li                ok = False
93*9c5db199SXin Li            if ok: result.addSuccess(self)
94*9c5db199SXin Li        finally:
95*9c5db199SXin Li            result.stopTest(self)
96*9c5db199SXin Li
97*9c5db199SXin Li
98*9c5db199SXin Li    def skip(self, msg=None):
99*9c5db199SXin Li        """Skip the test, with the given message."""
100*9c5db199SXin Li        raise SkipException(msg)
101*9c5db199SXin Li
102*9c5db199SXin Li
103*9c5db199SXin Li    def skipIf(self, expr, msg=None):
104*9c5db199SXin Li        """Skip the test if the expression is true."""
105*9c5db199SXin Li        if expr:
106*9c5db199SXin Li            raise SkipException(msg)
107*9c5db199SXin Li
108*9c5db199SXin Li
109*9c5db199SXin Lidef _TextTestResult_addSkipped(self, test, err):
110*9c5db199SXin Li    unittest.TestResult.addSkipped(self, test, err)
111*9c5db199SXin Li    if self.showAll:
112*9c5db199SXin Li        msg = str(err[1])
113*9c5db199SXin Li        if msg:
114*9c5db199SXin Li            msg = " (" + msg + ")"
115*9c5db199SXin Li        self.stream.writeln("SKIPPED" + msg)
116*9c5db199SXin Li    elif self.dots:
117*9c5db199SXin Li        self.stream.write('S')
118*9c5db199SXin Li
119*9c5db199SXin Liunittest._TextTestResult.addSkipped = _TextTestResult_addSkipped
120*9c5db199SXin Li
121*9c5db199SXin Li
122*9c5db199SXin Li# Bah
123*9c5db199SXin Lidef TextTestRunner_run(self, test):
124*9c5db199SXin Li    "Run the given test case or test suite."
125*9c5db199SXin Li    result = self._makeResult()
126*9c5db199SXin Li    startTime = time.time()
127*9c5db199SXin Li    test(result)
128*9c5db199SXin Li    stopTime = time.time()
129*9c5db199SXin Li    timeTaken = stopTime - startTime
130*9c5db199SXin Li    result.printErrors()
131*9c5db199SXin Li    self.stream.writeln(result.separator2)
132*9c5db199SXin Li    run = result.testsRun
133*9c5db199SXin Li    self.stream.writeln("Ran %d test%s in %.3fs" %
134*9c5db199SXin Li                        (run, run != 1 and "s" or "", timeTaken))
135*9c5db199SXin Li    self.stream.writeln()
136*9c5db199SXin Li    if not result.wasSuccessful():
137*9c5db199SXin Li        self.stream.write("FAILED (")
138*9c5db199SXin Li        failed, errored, skipped = list(map(
139*9c5db199SXin Li            len, (result.failures, result.errors, result.skipped)))
140*9c5db199SXin Li        if failed:
141*9c5db199SXin Li            self.stream.write("failures=%d" % failed)
142*9c5db199SXin Li        if errored:
143*9c5db199SXin Li            if failed: self.stream.write(", ")
144*9c5db199SXin Li            self.stream.write("errors=%d" % errored)
145*9c5db199SXin Li        if skipped:
146*9c5db199SXin Li            self.stream.write(", skipped=%d" % skipped)
147*9c5db199SXin Li        self.stream.writeln(")")
148*9c5db199SXin Li    else:
149*9c5db199SXin Li        if result.skipped:
150*9c5db199SXin Li            self.stream.writeln(
151*9c5db199SXin Li                "OK (skipped=%d)" % len(result.skipped))
152*9c5db199SXin Li        else:
153*9c5db199SXin Li            self.stream.writeln("OK")
154*9c5db199SXin Li    return result
155*9c5db199SXin Li
156*9c5db199SXin Liunittest.TextTestRunner.run = TextTestRunner_run
157