17db96d56Sopenharmony_ciimport io
27db96d56Sopenharmony_ciimport os
37db96d56Sopenharmony_ciimport sys
47db96d56Sopenharmony_ciimport pickle
57db96d56Sopenharmony_ciimport subprocess
67db96d56Sopenharmony_cifrom test import support
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ciimport unittest
97db96d56Sopenharmony_cifrom unittest.case import _Outcome
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_cifrom unittest.test.support import (LoggingResult,
127db96d56Sopenharmony_ci                                   ResultWithNoStartTestRunStopTestRun)
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_cidef resultFactory(*_):
167db96d56Sopenharmony_ci    return unittest.TestResult()
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_cidef getRunner():
207db96d56Sopenharmony_ci    return unittest.TextTestRunner(resultclass=resultFactory,
217db96d56Sopenharmony_ci                                   stream=io.StringIO())
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_cidef runTests(*cases):
257db96d56Sopenharmony_ci    suite = unittest.TestSuite()
267db96d56Sopenharmony_ci    for case in cases:
277db96d56Sopenharmony_ci        tests = unittest.defaultTestLoader.loadTestsFromTestCase(case)
287db96d56Sopenharmony_ci        suite.addTests(tests)
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci    runner = getRunner()
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci    # creating a nested suite exposes some potential bugs
337db96d56Sopenharmony_ci    realSuite = unittest.TestSuite()
347db96d56Sopenharmony_ci    realSuite.addTest(suite)
357db96d56Sopenharmony_ci    # adding empty suites to the end exposes potential bugs
367db96d56Sopenharmony_ci    suite.addTest(unittest.TestSuite())
377db96d56Sopenharmony_ci    realSuite.addTest(unittest.TestSuite())
387db96d56Sopenharmony_ci    return runner.run(realSuite)
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_cidef cleanup(ordering, blowUp=False):
427db96d56Sopenharmony_ci    if not blowUp:
437db96d56Sopenharmony_ci        ordering.append('cleanup_good')
447db96d56Sopenharmony_ci    else:
457db96d56Sopenharmony_ci        ordering.append('cleanup_exc')
467db96d56Sopenharmony_ci        raise Exception('CleanUpExc')
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ciclass TestCM:
507db96d56Sopenharmony_ci    def __init__(self, ordering, enter_result=None):
517db96d56Sopenharmony_ci        self.ordering = ordering
527db96d56Sopenharmony_ci        self.enter_result = enter_result
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci    def __enter__(self):
557db96d56Sopenharmony_ci        self.ordering.append('enter')
567db96d56Sopenharmony_ci        return self.enter_result
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    def __exit__(self, *exc_info):
597db96d56Sopenharmony_ci        self.ordering.append('exit')
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ciclass LacksEnterAndExit:
637db96d56Sopenharmony_ci    pass
647db96d56Sopenharmony_ciclass LacksEnter:
657db96d56Sopenharmony_ci    def __exit__(self, *exc_info):
667db96d56Sopenharmony_ci        pass
677db96d56Sopenharmony_ciclass LacksExit:
687db96d56Sopenharmony_ci    def __enter__(self):
697db96d56Sopenharmony_ci        pass
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ciclass TestCleanUp(unittest.TestCase):
737db96d56Sopenharmony_ci    def testCleanUp(self):
747db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
757db96d56Sopenharmony_ci            def testNothing(self):
767db96d56Sopenharmony_ci                pass
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci        test = TestableTest('testNothing')
797db96d56Sopenharmony_ci        self.assertEqual(test._cleanups, [])
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci        cleanups = []
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci        def cleanup1(*args, **kwargs):
847db96d56Sopenharmony_ci            cleanups.append((1, args, kwargs))
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci        def cleanup2(*args, **kwargs):
877db96d56Sopenharmony_ci            cleanups.append((2, args, kwargs))
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci        test.addCleanup(cleanup1, 1, 2, 3, four='hello', five='goodbye')
907db96d56Sopenharmony_ci        test.addCleanup(cleanup2)
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci        self.assertEqual(test._cleanups,
937db96d56Sopenharmony_ci                         [(cleanup1, (1, 2, 3), dict(four='hello', five='goodbye')),
947db96d56Sopenharmony_ci                          (cleanup2, (), {})])
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci        self.assertTrue(test.doCleanups())
977db96d56Sopenharmony_ci        self.assertEqual(cleanups, [(2, (), {}), (1, (1, 2, 3), dict(four='hello', five='goodbye'))])
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci    def testCleanUpWithErrors(self):
1007db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
1017db96d56Sopenharmony_ci            def testNothing(self):
1027db96d56Sopenharmony_ci                pass
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci        test = TestableTest('testNothing')
1057db96d56Sopenharmony_ci        result = unittest.TestResult()
1067db96d56Sopenharmony_ci        outcome = test._outcome = _Outcome(result=result)
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci        CleanUpExc = Exception('foo')
1097db96d56Sopenharmony_ci        exc2 = Exception('bar')
1107db96d56Sopenharmony_ci        def cleanup1():
1117db96d56Sopenharmony_ci            raise CleanUpExc
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci        def cleanup2():
1147db96d56Sopenharmony_ci            raise exc2
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci        test.addCleanup(cleanup1)
1177db96d56Sopenharmony_ci        test.addCleanup(cleanup2)
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci        self.assertFalse(test.doCleanups())
1207db96d56Sopenharmony_ci        self.assertFalse(outcome.success)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci        (_, msg2), (_, msg1) = result.errors
1237db96d56Sopenharmony_ci        self.assertIn('in cleanup1', msg1)
1247db96d56Sopenharmony_ci        self.assertIn('raise CleanUpExc', msg1)
1257db96d56Sopenharmony_ci        self.assertIn('Exception: foo', msg1)
1267db96d56Sopenharmony_ci        self.assertIn('in cleanup2', msg2)
1277db96d56Sopenharmony_ci        self.assertIn('raise exc2', msg2)
1287db96d56Sopenharmony_ci        self.assertIn('Exception: bar', msg2)
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci    def testCleanupInRun(self):
1317db96d56Sopenharmony_ci        blowUp = False
1327db96d56Sopenharmony_ci        ordering = []
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
1357db96d56Sopenharmony_ci            def setUp(self):
1367db96d56Sopenharmony_ci                ordering.append('setUp')
1377db96d56Sopenharmony_ci                test.addCleanup(cleanup2)
1387db96d56Sopenharmony_ci                if blowUp:
1397db96d56Sopenharmony_ci                    raise Exception('foo')
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci            def testNothing(self):
1427db96d56Sopenharmony_ci                ordering.append('test')
1437db96d56Sopenharmony_ci                test.addCleanup(cleanup3)
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci            def tearDown(self):
1467db96d56Sopenharmony_ci                ordering.append('tearDown')
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci        test = TestableTest('testNothing')
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci        def cleanup1():
1517db96d56Sopenharmony_ci            ordering.append('cleanup1')
1527db96d56Sopenharmony_ci        def cleanup2():
1537db96d56Sopenharmony_ci            ordering.append('cleanup2')
1547db96d56Sopenharmony_ci        def cleanup3():
1557db96d56Sopenharmony_ci            ordering.append('cleanup3')
1567db96d56Sopenharmony_ci        test.addCleanup(cleanup1)
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci        def success(some_test):
1597db96d56Sopenharmony_ci            self.assertEqual(some_test, test)
1607db96d56Sopenharmony_ci            ordering.append('success')
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci        result = unittest.TestResult()
1637db96d56Sopenharmony_ci        result.addSuccess = success
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci        test.run(result)
1667db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup3',
1677db96d56Sopenharmony_ci                                    'cleanup2', 'cleanup1', 'success'])
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci        blowUp = True
1707db96d56Sopenharmony_ci        ordering = []
1717db96d56Sopenharmony_ci        test = TestableTest('testNothing')
1727db96d56Sopenharmony_ci        test.addCleanup(cleanup1)
1737db96d56Sopenharmony_ci        test.run(result)
1747db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUp', 'cleanup2', 'cleanup1'])
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci    def testTestCaseDebugExecutesCleanups(self):
1777db96d56Sopenharmony_ci        ordering = []
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
1807db96d56Sopenharmony_ci            def setUp(self):
1817db96d56Sopenharmony_ci                ordering.append('setUp')
1827db96d56Sopenharmony_ci                self.addCleanup(cleanup1)
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci            def testNothing(self):
1857db96d56Sopenharmony_ci                ordering.append('test')
1867db96d56Sopenharmony_ci                self.addCleanup(cleanup3)
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci            def tearDown(self):
1897db96d56Sopenharmony_ci                ordering.append('tearDown')
1907db96d56Sopenharmony_ci                test.addCleanup(cleanup4)
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci        test = TestableTest('testNothing')
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci        def cleanup1():
1957db96d56Sopenharmony_ci            ordering.append('cleanup1')
1967db96d56Sopenharmony_ci            test.addCleanup(cleanup2)
1977db96d56Sopenharmony_ci        def cleanup2():
1987db96d56Sopenharmony_ci            ordering.append('cleanup2')
1997db96d56Sopenharmony_ci        def cleanup3():
2007db96d56Sopenharmony_ci            ordering.append('cleanup3')
2017db96d56Sopenharmony_ci        def cleanup4():
2027db96d56Sopenharmony_ci            ordering.append('cleanup4')
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci        test.debug()
2057db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUp', 'test', 'tearDown', 'cleanup4',
2067db96d56Sopenharmony_ci                                    'cleanup3', 'cleanup1', 'cleanup2'])
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci    def test_enterContext(self):
2107db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
2117db96d56Sopenharmony_ci            def testNothing(self):
2127db96d56Sopenharmony_ci                pass
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci        test = TestableTest('testNothing')
2157db96d56Sopenharmony_ci        cleanups = []
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci        test.addCleanup(cleanups.append, 'cleanup1')
2187db96d56Sopenharmony_ci        cm = TestCM(cleanups, 42)
2197db96d56Sopenharmony_ci        self.assertEqual(test.enterContext(cm), 42)
2207db96d56Sopenharmony_ci        test.addCleanup(cleanups.append, 'cleanup2')
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci        self.assertTrue(test.doCleanups())
2237db96d56Sopenharmony_ci        self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1'])
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci    def test_enterContext_arg_errors(self):
2267db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
2277db96d56Sopenharmony_ci            def testNothing(self):
2287db96d56Sopenharmony_ci                pass
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci        test = TestableTest('testNothing')
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'the context manager'):
2337db96d56Sopenharmony_ci            test.enterContext(LacksEnterAndExit())
2347db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'the context manager'):
2357db96d56Sopenharmony_ci            test.enterContext(LacksEnter())
2367db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'the context manager'):
2377db96d56Sopenharmony_ci            test.enterContext(LacksExit())
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci        self.assertEqual(test._cleanups, [])
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ciclass TestClassCleanup(unittest.TestCase):
2437db96d56Sopenharmony_ci    def test_addClassCleanUp(self):
2447db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
2457db96d56Sopenharmony_ci            def testNothing(self):
2467db96d56Sopenharmony_ci                pass
2477db96d56Sopenharmony_ci        test = TestableTest('testNothing')
2487db96d56Sopenharmony_ci        self.assertEqual(test._class_cleanups, [])
2497db96d56Sopenharmony_ci        class_cleanups = []
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci        def class_cleanup1(*args, **kwargs):
2527db96d56Sopenharmony_ci            class_cleanups.append((3, args, kwargs))
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci        def class_cleanup2(*args, **kwargs):
2557db96d56Sopenharmony_ci            class_cleanups.append((4, args, kwargs))
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci        TestableTest.addClassCleanup(class_cleanup1, 1, 2, 3,
2587db96d56Sopenharmony_ci                                     four='hello', five='goodbye')
2597db96d56Sopenharmony_ci        TestableTest.addClassCleanup(class_cleanup2)
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci        self.assertEqual(test._class_cleanups,
2627db96d56Sopenharmony_ci                         [(class_cleanup1, (1, 2, 3),
2637db96d56Sopenharmony_ci                           dict(four='hello', five='goodbye')),
2647db96d56Sopenharmony_ci                          (class_cleanup2, (), {})])
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci        TestableTest.doClassCleanups()
2677db96d56Sopenharmony_ci        self.assertEqual(class_cleanups, [(4, (), {}), (3, (1, 2, 3),
2687db96d56Sopenharmony_ci                                          dict(four='hello', five='goodbye'))])
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci    def test_run_class_cleanUp(self):
2717db96d56Sopenharmony_ci        ordering = []
2727db96d56Sopenharmony_ci        blowUp = True
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
2757db96d56Sopenharmony_ci            @classmethod
2767db96d56Sopenharmony_ci            def setUpClass(cls):
2777db96d56Sopenharmony_ci                ordering.append('setUpClass')
2787db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, ordering)
2797db96d56Sopenharmony_ci                if blowUp:
2807db96d56Sopenharmony_ci                    raise Exception()
2817db96d56Sopenharmony_ci            def testNothing(self):
2827db96d56Sopenharmony_ci                ordering.append('test')
2837db96d56Sopenharmony_ci            @classmethod
2847db96d56Sopenharmony_ci            def tearDownClass(cls):
2857db96d56Sopenharmony_ci                ordering.append('tearDownClass')
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci        runTests(TestableTest)
2887db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpClass', 'cleanup_good'])
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci        ordering = []
2917db96d56Sopenharmony_ci        blowUp = False
2927db96d56Sopenharmony_ci        runTests(TestableTest)
2937db96d56Sopenharmony_ci        self.assertEqual(ordering,
2947db96d56Sopenharmony_ci                         ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci    def test_run_class_cleanUp_without_tearDownClass(self):
2977db96d56Sopenharmony_ci        ordering = []
2987db96d56Sopenharmony_ci        blowUp = True
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
3017db96d56Sopenharmony_ci            @classmethod
3027db96d56Sopenharmony_ci            def setUpClass(cls):
3037db96d56Sopenharmony_ci                ordering.append('setUpClass')
3047db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, ordering)
3057db96d56Sopenharmony_ci                if blowUp:
3067db96d56Sopenharmony_ci                    raise Exception()
3077db96d56Sopenharmony_ci            def testNothing(self):
3087db96d56Sopenharmony_ci                ordering.append('test')
3097db96d56Sopenharmony_ci            @classmethod
3107db96d56Sopenharmony_ci            @property
3117db96d56Sopenharmony_ci            def tearDownClass(cls):
3127db96d56Sopenharmony_ci                raise AttributeError
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci        runTests(TestableTest)
3157db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpClass', 'cleanup_good'])
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci        ordering = []
3187db96d56Sopenharmony_ci        blowUp = False
3197db96d56Sopenharmony_ci        runTests(TestableTest)
3207db96d56Sopenharmony_ci        self.assertEqual(ordering,
3217db96d56Sopenharmony_ci                         ['setUpClass', 'test', 'cleanup_good'])
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci    def test_debug_executes_classCleanUp(self):
3247db96d56Sopenharmony_ci        ordering = []
3257db96d56Sopenharmony_ci        blowUp = False
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
3287db96d56Sopenharmony_ci            @classmethod
3297db96d56Sopenharmony_ci            def setUpClass(cls):
3307db96d56Sopenharmony_ci                ordering.append('setUpClass')
3317db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, ordering, blowUp=blowUp)
3327db96d56Sopenharmony_ci            def testNothing(self):
3337db96d56Sopenharmony_ci                ordering.append('test')
3347db96d56Sopenharmony_ci            @classmethod
3357db96d56Sopenharmony_ci            def tearDownClass(cls):
3367db96d56Sopenharmony_ci                ordering.append('tearDownClass')
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci        suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
3397db96d56Sopenharmony_ci        suite.debug()
3407db96d56Sopenharmony_ci        self.assertEqual(ordering,
3417db96d56Sopenharmony_ci                         ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ci        ordering = []
3447db96d56Sopenharmony_ci        blowUp = True
3457db96d56Sopenharmony_ci        suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
3467db96d56Sopenharmony_ci        with self.assertRaises(Exception) as cm:
3477db96d56Sopenharmony_ci            suite.debug()
3487db96d56Sopenharmony_ci        self.assertEqual(str(cm.exception), 'CleanUpExc')
3497db96d56Sopenharmony_ci        self.assertEqual(ordering,
3507db96d56Sopenharmony_ci                         ['setUpClass', 'test', 'tearDownClass', 'cleanup_exc'])
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci    def test_debug_executes_classCleanUp_when_teardown_exception(self):
3537db96d56Sopenharmony_ci        ordering = []
3547db96d56Sopenharmony_ci        blowUp = False
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
3577db96d56Sopenharmony_ci            @classmethod
3587db96d56Sopenharmony_ci            def setUpClass(cls):
3597db96d56Sopenharmony_ci                ordering.append('setUpClass')
3607db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, ordering, blowUp=blowUp)
3617db96d56Sopenharmony_ci            def testNothing(self):
3627db96d56Sopenharmony_ci                ordering.append('test')
3637db96d56Sopenharmony_ci            @classmethod
3647db96d56Sopenharmony_ci            def tearDownClass(cls):
3657db96d56Sopenharmony_ci                ordering.append('tearDownClass')
3667db96d56Sopenharmony_ci                raise Exception('TearDownClassExc')
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci        suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
3697db96d56Sopenharmony_ci        with self.assertRaises(Exception) as cm:
3707db96d56Sopenharmony_ci            suite.debug()
3717db96d56Sopenharmony_ci        self.assertEqual(str(cm.exception), 'TearDownClassExc')
3727db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass'])
3737db96d56Sopenharmony_ci        self.assertTrue(TestableTest._class_cleanups)
3747db96d56Sopenharmony_ci        TestableTest._class_cleanups.clear()
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci        ordering = []
3777db96d56Sopenharmony_ci        blowUp = True
3787db96d56Sopenharmony_ci        suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
3797db96d56Sopenharmony_ci        with self.assertRaises(Exception) as cm:
3807db96d56Sopenharmony_ci            suite.debug()
3817db96d56Sopenharmony_ci        self.assertEqual(str(cm.exception), 'TearDownClassExc')
3827db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpClass', 'test', 'tearDownClass'])
3837db96d56Sopenharmony_ci        self.assertTrue(TestableTest._class_cleanups)
3847db96d56Sopenharmony_ci        TestableTest._class_cleanups.clear()
3857db96d56Sopenharmony_ci
3867db96d56Sopenharmony_ci    def test_doClassCleanups_with_errors_addClassCleanUp(self):
3877db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
3887db96d56Sopenharmony_ci            def testNothing(self):
3897db96d56Sopenharmony_ci                pass
3907db96d56Sopenharmony_ci
3917db96d56Sopenharmony_ci        def cleanup1():
3927db96d56Sopenharmony_ci            raise Exception('cleanup1')
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci        def cleanup2():
3957db96d56Sopenharmony_ci            raise Exception('cleanup2')
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci        TestableTest.addClassCleanup(cleanup1)
3987db96d56Sopenharmony_ci        TestableTest.addClassCleanup(cleanup2)
3997db96d56Sopenharmony_ci        with self.assertRaises(Exception) as e:
4007db96d56Sopenharmony_ci            TestableTest.doClassCleanups()
4017db96d56Sopenharmony_ci            self.assertEqual(e, 'cleanup1')
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci    def test_with_errors_addCleanUp(self):
4047db96d56Sopenharmony_ci        ordering = []
4057db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
4067db96d56Sopenharmony_ci            @classmethod
4077db96d56Sopenharmony_ci            def setUpClass(cls):
4087db96d56Sopenharmony_ci                ordering.append('setUpClass')
4097db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, ordering)
4107db96d56Sopenharmony_ci            def setUp(self):
4117db96d56Sopenharmony_ci                ordering.append('setUp')
4127db96d56Sopenharmony_ci                self.addCleanup(cleanup, ordering, blowUp=True)
4137db96d56Sopenharmony_ci            def testNothing(self):
4147db96d56Sopenharmony_ci                pass
4157db96d56Sopenharmony_ci            @classmethod
4167db96d56Sopenharmony_ci            def tearDownClass(cls):
4177db96d56Sopenharmony_ci                ordering.append('tearDownClass')
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci        result = runTests(TestableTest)
4207db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
4217db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
4227db96d56Sopenharmony_ci        self.assertEqual(ordering,
4237db96d56Sopenharmony_ci                         ['setUpClass', 'setUp', 'cleanup_exc',
4247db96d56Sopenharmony_ci                          'tearDownClass', 'cleanup_good'])
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci    def test_run_with_errors_addClassCleanUp(self):
4277db96d56Sopenharmony_ci        ordering = []
4287db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
4297db96d56Sopenharmony_ci            @classmethod
4307db96d56Sopenharmony_ci            def setUpClass(cls):
4317db96d56Sopenharmony_ci                ordering.append('setUpClass')
4327db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, ordering, blowUp=True)
4337db96d56Sopenharmony_ci            def setUp(self):
4347db96d56Sopenharmony_ci                ordering.append('setUp')
4357db96d56Sopenharmony_ci                self.addCleanup(cleanup, ordering)
4367db96d56Sopenharmony_ci            def testNothing(self):
4377db96d56Sopenharmony_ci                ordering.append('test')
4387db96d56Sopenharmony_ci            @classmethod
4397db96d56Sopenharmony_ci            def tearDownClass(cls):
4407db96d56Sopenharmony_ci                ordering.append('tearDownClass')
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ci        result = runTests(TestableTest)
4437db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
4447db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
4457db96d56Sopenharmony_ci        self.assertEqual(ordering,
4467db96d56Sopenharmony_ci                         ['setUpClass', 'setUp', 'test', 'cleanup_good',
4477db96d56Sopenharmony_ci                          'tearDownClass', 'cleanup_exc'])
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci    def test_with_errors_in_addClassCleanup_and_setUps(self):
4507db96d56Sopenharmony_ci        ordering = []
4517db96d56Sopenharmony_ci        class_blow_up = False
4527db96d56Sopenharmony_ci        method_blow_up = False
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
4557db96d56Sopenharmony_ci            @classmethod
4567db96d56Sopenharmony_ci            def setUpClass(cls):
4577db96d56Sopenharmony_ci                ordering.append('setUpClass')
4587db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, ordering, blowUp=True)
4597db96d56Sopenharmony_ci                if class_blow_up:
4607db96d56Sopenharmony_ci                    raise Exception('ClassExc')
4617db96d56Sopenharmony_ci            def setUp(self):
4627db96d56Sopenharmony_ci                ordering.append('setUp')
4637db96d56Sopenharmony_ci                if method_blow_up:
4647db96d56Sopenharmony_ci                    raise Exception('MethodExc')
4657db96d56Sopenharmony_ci            def testNothing(self):
4667db96d56Sopenharmony_ci                ordering.append('test')
4677db96d56Sopenharmony_ci            @classmethod
4687db96d56Sopenharmony_ci            def tearDownClass(cls):
4697db96d56Sopenharmony_ci                ordering.append('tearDownClass')
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci        result = runTests(TestableTest)
4727db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
4737db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
4747db96d56Sopenharmony_ci        self.assertEqual(ordering,
4757db96d56Sopenharmony_ci                         ['setUpClass', 'setUp', 'test',
4767db96d56Sopenharmony_ci                          'tearDownClass', 'cleanup_exc'])
4777db96d56Sopenharmony_ci
4787db96d56Sopenharmony_ci        ordering = []
4797db96d56Sopenharmony_ci        class_blow_up = True
4807db96d56Sopenharmony_ci        method_blow_up = False
4817db96d56Sopenharmony_ci        result = runTests(TestableTest)
4827db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
4837db96d56Sopenharmony_ci                         'Exception: ClassExc')
4847db96d56Sopenharmony_ci        self.assertEqual(result.errors[1][1].splitlines()[-1],
4857db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
4867db96d56Sopenharmony_ci        self.assertEqual(ordering,
4877db96d56Sopenharmony_ci                         ['setUpClass', 'cleanup_exc'])
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_ci        ordering = []
4907db96d56Sopenharmony_ci        class_blow_up = False
4917db96d56Sopenharmony_ci        method_blow_up = True
4927db96d56Sopenharmony_ci        result = runTests(TestableTest)
4937db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
4947db96d56Sopenharmony_ci                         'Exception: MethodExc')
4957db96d56Sopenharmony_ci        self.assertEqual(result.errors[1][1].splitlines()[-1],
4967db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
4977db96d56Sopenharmony_ci        self.assertEqual(ordering,
4987db96d56Sopenharmony_ci                         ['setUpClass', 'setUp', 'tearDownClass',
4997db96d56Sopenharmony_ci                          'cleanup_exc'])
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci    def test_with_errors_in_tearDownClass(self):
5027db96d56Sopenharmony_ci        ordering = []
5037db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
5047db96d56Sopenharmony_ci            @classmethod
5057db96d56Sopenharmony_ci            def setUpClass(cls):
5067db96d56Sopenharmony_ci                ordering.append('setUpClass')
5077db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, ordering)
5087db96d56Sopenharmony_ci            def testNothing(self):
5097db96d56Sopenharmony_ci                ordering.append('test')
5107db96d56Sopenharmony_ci            @classmethod
5117db96d56Sopenharmony_ci            def tearDownClass(cls):
5127db96d56Sopenharmony_ci                ordering.append('tearDownClass')
5137db96d56Sopenharmony_ci                raise Exception('TearDownExc')
5147db96d56Sopenharmony_ci
5157db96d56Sopenharmony_ci        result = runTests(TestableTest)
5167db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
5177db96d56Sopenharmony_ci                         'Exception: TearDownExc')
5187db96d56Sopenharmony_ci        self.assertEqual(ordering,
5197db96d56Sopenharmony_ci                         ['setUpClass', 'test', 'tearDownClass', 'cleanup_good'])
5207db96d56Sopenharmony_ci
5217db96d56Sopenharmony_ci    def test_enterClassContext(self):
5227db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
5237db96d56Sopenharmony_ci            def testNothing(self):
5247db96d56Sopenharmony_ci                pass
5257db96d56Sopenharmony_ci
5267db96d56Sopenharmony_ci        cleanups = []
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ci        TestableTest.addClassCleanup(cleanups.append, 'cleanup1')
5297db96d56Sopenharmony_ci        cm = TestCM(cleanups, 42)
5307db96d56Sopenharmony_ci        self.assertEqual(TestableTest.enterClassContext(cm), 42)
5317db96d56Sopenharmony_ci        TestableTest.addClassCleanup(cleanups.append, 'cleanup2')
5327db96d56Sopenharmony_ci
5337db96d56Sopenharmony_ci        TestableTest.doClassCleanups()
5347db96d56Sopenharmony_ci        self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1'])
5357db96d56Sopenharmony_ci
5367db96d56Sopenharmony_ci    def test_enterClassContext_arg_errors(self):
5377db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
5387db96d56Sopenharmony_ci            def testNothing(self):
5397db96d56Sopenharmony_ci                pass
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'the context manager'):
5427db96d56Sopenharmony_ci            TestableTest.enterClassContext(LacksEnterAndExit())
5437db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'the context manager'):
5447db96d56Sopenharmony_ci            TestableTest.enterClassContext(LacksEnter())
5457db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'the context manager'):
5467db96d56Sopenharmony_ci            TestableTest.enterClassContext(LacksExit())
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_ci        self.assertEqual(TestableTest._class_cleanups, [])
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci    def test_run_nested_test(self):
5517db96d56Sopenharmony_ci        ordering = []
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_ci        class InnerTest(unittest.TestCase):
5547db96d56Sopenharmony_ci            @classmethod
5557db96d56Sopenharmony_ci            def setUpClass(cls):
5567db96d56Sopenharmony_ci                ordering.append('inner setup')
5577db96d56Sopenharmony_ci                cls.addClassCleanup(ordering.append, 'inner cleanup')
5587db96d56Sopenharmony_ci            def test(self):
5597db96d56Sopenharmony_ci                ordering.append('inner test')
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci        class OuterTest(unittest.TestCase):
5627db96d56Sopenharmony_ci            @classmethod
5637db96d56Sopenharmony_ci            def setUpClass(cls):
5647db96d56Sopenharmony_ci                ordering.append('outer setup')
5657db96d56Sopenharmony_ci                cls.addClassCleanup(ordering.append, 'outer cleanup')
5667db96d56Sopenharmony_ci            def test(self):
5677db96d56Sopenharmony_ci                ordering.append('start outer test')
5687db96d56Sopenharmony_ci                runTests(InnerTest)
5697db96d56Sopenharmony_ci                ordering.append('end outer test')
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci        runTests(OuterTest)
5727db96d56Sopenharmony_ci        self.assertEqual(ordering, [
5737db96d56Sopenharmony_ci                'outer setup', 'start outer test',
5747db96d56Sopenharmony_ci                'inner setup', 'inner test', 'inner cleanup',
5757db96d56Sopenharmony_ci                'end outer test', 'outer cleanup'])
5767db96d56Sopenharmony_ci
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ciclass TestModuleCleanUp(unittest.TestCase):
5797db96d56Sopenharmony_ci    def test_add_and_do_ModuleCleanup(self):
5807db96d56Sopenharmony_ci        module_cleanups = []
5817db96d56Sopenharmony_ci
5827db96d56Sopenharmony_ci        def module_cleanup1(*args, **kwargs):
5837db96d56Sopenharmony_ci            module_cleanups.append((3, args, kwargs))
5847db96d56Sopenharmony_ci
5857db96d56Sopenharmony_ci        def module_cleanup2(*args, **kwargs):
5867db96d56Sopenharmony_ci            module_cleanups.append((4, args, kwargs))
5877db96d56Sopenharmony_ci
5887db96d56Sopenharmony_ci        class Module(object):
5897db96d56Sopenharmony_ci            unittest.addModuleCleanup(module_cleanup1, 1, 2, 3,
5907db96d56Sopenharmony_ci                                      four='hello', five='goodbye')
5917db96d56Sopenharmony_ci            unittest.addModuleCleanup(module_cleanup2)
5927db96d56Sopenharmony_ci
5937db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups,
5947db96d56Sopenharmony_ci                         [(module_cleanup1, (1, 2, 3),
5957db96d56Sopenharmony_ci                           dict(four='hello', five='goodbye')),
5967db96d56Sopenharmony_ci                          (module_cleanup2, (), {})])
5977db96d56Sopenharmony_ci
5987db96d56Sopenharmony_ci        unittest.case.doModuleCleanups()
5997db96d56Sopenharmony_ci        self.assertEqual(module_cleanups, [(4, (), {}), (3, (1, 2, 3),
6007db96d56Sopenharmony_ci                                          dict(four='hello', five='goodbye'))])
6017db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups, [])
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci    def test_doModuleCleanup_with_errors_in_addModuleCleanup(self):
6047db96d56Sopenharmony_ci        module_cleanups = []
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_ci        def module_cleanup_good(*args, **kwargs):
6077db96d56Sopenharmony_ci            module_cleanups.append((3, args, kwargs))
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci        def module_cleanup_bad(*args, **kwargs):
6107db96d56Sopenharmony_ci            raise Exception('CleanUpExc')
6117db96d56Sopenharmony_ci
6127db96d56Sopenharmony_ci        class Module(object):
6137db96d56Sopenharmony_ci            unittest.addModuleCleanup(module_cleanup_good, 1, 2, 3,
6147db96d56Sopenharmony_ci                                      four='hello', five='goodbye')
6157db96d56Sopenharmony_ci            unittest.addModuleCleanup(module_cleanup_bad)
6167db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups,
6177db96d56Sopenharmony_ci                         [(module_cleanup_good, (1, 2, 3),
6187db96d56Sopenharmony_ci                           dict(four='hello', five='goodbye')),
6197db96d56Sopenharmony_ci                          (module_cleanup_bad, (), {})])
6207db96d56Sopenharmony_ci        with self.assertRaises(Exception) as e:
6217db96d56Sopenharmony_ci            unittest.case.doModuleCleanups()
6227db96d56Sopenharmony_ci        self.assertEqual(str(e.exception), 'CleanUpExc')
6237db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups, [])
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci    def test_addModuleCleanup_arg_errors(self):
6267db96d56Sopenharmony_ci        cleanups = []
6277db96d56Sopenharmony_ci        def cleanup(*args, **kwargs):
6287db96d56Sopenharmony_ci            cleanups.append((args, kwargs))
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ci        class Module(object):
6317db96d56Sopenharmony_ci            unittest.addModuleCleanup(cleanup, 1, 2, function='hello')
6327db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
6337db96d56Sopenharmony_ci                unittest.addModuleCleanup(function=cleanup, arg='hello')
6347db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
6357db96d56Sopenharmony_ci                unittest.addModuleCleanup()
6367db96d56Sopenharmony_ci        unittest.case.doModuleCleanups()
6377db96d56Sopenharmony_ci        self.assertEqual(cleanups,
6387db96d56Sopenharmony_ci                         [((1, 2), {'function': 'hello'})])
6397db96d56Sopenharmony_ci
6407db96d56Sopenharmony_ci    def test_run_module_cleanUp(self):
6417db96d56Sopenharmony_ci        blowUp = True
6427db96d56Sopenharmony_ci        ordering = []
6437db96d56Sopenharmony_ci        class Module(object):
6447db96d56Sopenharmony_ci            @staticmethod
6457db96d56Sopenharmony_ci            def setUpModule():
6467db96d56Sopenharmony_ci                ordering.append('setUpModule')
6477db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering)
6487db96d56Sopenharmony_ci                if blowUp:
6497db96d56Sopenharmony_ci                    raise Exception('setUpModule Exc')
6507db96d56Sopenharmony_ci            @staticmethod
6517db96d56Sopenharmony_ci            def tearDownModule():
6527db96d56Sopenharmony_ci                ordering.append('tearDownModule')
6537db96d56Sopenharmony_ci
6547db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
6557db96d56Sopenharmony_ci            @classmethod
6567db96d56Sopenharmony_ci            def setUpClass(cls):
6577db96d56Sopenharmony_ci                ordering.append('setUpClass')
6587db96d56Sopenharmony_ci            def testNothing(self):
6597db96d56Sopenharmony_ci                ordering.append('test')
6607db96d56Sopenharmony_ci            @classmethod
6617db96d56Sopenharmony_ci            def tearDownClass(cls):
6627db96d56Sopenharmony_ci                ordering.append('tearDownClass')
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module'
6657db96d56Sopenharmony_ci        sys.modules['Module'] = Module
6667db96d56Sopenharmony_ci        result = runTests(TestableTest)
6677db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'cleanup_good'])
6687db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
6697db96d56Sopenharmony_ci                         'Exception: setUpModule Exc')
6707db96d56Sopenharmony_ci
6717db96d56Sopenharmony_ci        ordering = []
6727db96d56Sopenharmony_ci        blowUp = False
6737db96d56Sopenharmony_ci        runTests(TestableTest)
6747db96d56Sopenharmony_ci        self.assertEqual(ordering,
6757db96d56Sopenharmony_ci                         ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
6767db96d56Sopenharmony_ci                          'tearDownModule', 'cleanup_good'])
6777db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups, [])
6787db96d56Sopenharmony_ci
6797db96d56Sopenharmony_ci    def test_run_multiple_module_cleanUp(self):
6807db96d56Sopenharmony_ci        blowUp = True
6817db96d56Sopenharmony_ci        blowUp2 = False
6827db96d56Sopenharmony_ci        ordering = []
6837db96d56Sopenharmony_ci        class Module1(object):
6847db96d56Sopenharmony_ci            @staticmethod
6857db96d56Sopenharmony_ci            def setUpModule():
6867db96d56Sopenharmony_ci                ordering.append('setUpModule')
6877db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering)
6887db96d56Sopenharmony_ci                if blowUp:
6897db96d56Sopenharmony_ci                    raise Exception()
6907db96d56Sopenharmony_ci            @staticmethod
6917db96d56Sopenharmony_ci            def tearDownModule():
6927db96d56Sopenharmony_ci                ordering.append('tearDownModule')
6937db96d56Sopenharmony_ci
6947db96d56Sopenharmony_ci        class Module2(object):
6957db96d56Sopenharmony_ci            @staticmethod
6967db96d56Sopenharmony_ci            def setUpModule():
6977db96d56Sopenharmony_ci                ordering.append('setUpModule2')
6987db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering)
6997db96d56Sopenharmony_ci                if blowUp2:
7007db96d56Sopenharmony_ci                    raise Exception()
7017db96d56Sopenharmony_ci            @staticmethod
7027db96d56Sopenharmony_ci            def tearDownModule():
7037db96d56Sopenharmony_ci                ordering.append('tearDownModule2')
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
7067db96d56Sopenharmony_ci            @classmethod
7077db96d56Sopenharmony_ci            def setUpClass(cls):
7087db96d56Sopenharmony_ci                ordering.append('setUpClass')
7097db96d56Sopenharmony_ci            def testNothing(self):
7107db96d56Sopenharmony_ci                ordering.append('test')
7117db96d56Sopenharmony_ci            @classmethod
7127db96d56Sopenharmony_ci            def tearDownClass(cls):
7137db96d56Sopenharmony_ci                ordering.append('tearDownClass')
7147db96d56Sopenharmony_ci
7157db96d56Sopenharmony_ci        class TestableTest2(unittest.TestCase):
7167db96d56Sopenharmony_ci            @classmethod
7177db96d56Sopenharmony_ci            def setUpClass(cls):
7187db96d56Sopenharmony_ci                ordering.append('setUpClass2')
7197db96d56Sopenharmony_ci            def testNothing(self):
7207db96d56Sopenharmony_ci                ordering.append('test2')
7217db96d56Sopenharmony_ci            @classmethod
7227db96d56Sopenharmony_ci            def tearDownClass(cls):
7237db96d56Sopenharmony_ci                ordering.append('tearDownClass2')
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module1'
7267db96d56Sopenharmony_ci        sys.modules['Module1'] = Module1
7277db96d56Sopenharmony_ci        TestableTest2.__module__ = 'Module2'
7287db96d56Sopenharmony_ci        sys.modules['Module2'] = Module2
7297db96d56Sopenharmony_ci        runTests(TestableTest, TestableTest2)
7307db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'cleanup_good',
7317db96d56Sopenharmony_ci                                    'setUpModule2', 'setUpClass2', 'test2',
7327db96d56Sopenharmony_ci                                    'tearDownClass2', 'tearDownModule2',
7337db96d56Sopenharmony_ci                                    'cleanup_good'])
7347db96d56Sopenharmony_ci        ordering = []
7357db96d56Sopenharmony_ci        blowUp = False
7367db96d56Sopenharmony_ci        blowUp2 = True
7377db96d56Sopenharmony_ci        runTests(TestableTest, TestableTest2)
7387db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
7397db96d56Sopenharmony_ci                                    'tearDownClass', 'tearDownModule',
7407db96d56Sopenharmony_ci                                    'cleanup_good', 'setUpModule2',
7417db96d56Sopenharmony_ci                                    'cleanup_good'])
7427db96d56Sopenharmony_ci
7437db96d56Sopenharmony_ci        ordering = []
7447db96d56Sopenharmony_ci        blowUp = False
7457db96d56Sopenharmony_ci        blowUp2 = False
7467db96d56Sopenharmony_ci        runTests(TestableTest, TestableTest2)
7477db96d56Sopenharmony_ci        self.assertEqual(ordering,
7487db96d56Sopenharmony_ci                         ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
7497db96d56Sopenharmony_ci                          'tearDownModule', 'cleanup_good', 'setUpModule2',
7507db96d56Sopenharmony_ci                          'setUpClass2', 'test2', 'tearDownClass2',
7517db96d56Sopenharmony_ci                          'tearDownModule2', 'cleanup_good'])
7527db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups, [])
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ci    def test_run_module_cleanUp_without_teardown(self):
7557db96d56Sopenharmony_ci        ordering = []
7567db96d56Sopenharmony_ci        class Module(object):
7577db96d56Sopenharmony_ci            @staticmethod
7587db96d56Sopenharmony_ci            def setUpModule():
7597db96d56Sopenharmony_ci                ordering.append('setUpModule')
7607db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering)
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
7637db96d56Sopenharmony_ci            @classmethod
7647db96d56Sopenharmony_ci            def setUpClass(cls):
7657db96d56Sopenharmony_ci                ordering.append('setUpClass')
7667db96d56Sopenharmony_ci            def testNothing(self):
7677db96d56Sopenharmony_ci                ordering.append('test')
7687db96d56Sopenharmony_ci            @classmethod
7697db96d56Sopenharmony_ci            def tearDownClass(cls):
7707db96d56Sopenharmony_ci                ordering.append('tearDownClass')
7717db96d56Sopenharmony_ci
7727db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module'
7737db96d56Sopenharmony_ci        sys.modules['Module'] = Module
7747db96d56Sopenharmony_ci        runTests(TestableTest)
7757db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
7767db96d56Sopenharmony_ci                                    'tearDownClass', 'cleanup_good'])
7777db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups, [])
7787db96d56Sopenharmony_ci
7797db96d56Sopenharmony_ci    def test_run_module_cleanUp_when_teardown_exception(self):
7807db96d56Sopenharmony_ci        ordering = []
7817db96d56Sopenharmony_ci        class Module(object):
7827db96d56Sopenharmony_ci            @staticmethod
7837db96d56Sopenharmony_ci            def setUpModule():
7847db96d56Sopenharmony_ci                ordering.append('setUpModule')
7857db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering)
7867db96d56Sopenharmony_ci            @staticmethod
7877db96d56Sopenharmony_ci            def tearDownModule():
7887db96d56Sopenharmony_ci                ordering.append('tearDownModule')
7897db96d56Sopenharmony_ci                raise Exception('CleanUpExc')
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
7927db96d56Sopenharmony_ci            @classmethod
7937db96d56Sopenharmony_ci            def setUpClass(cls):
7947db96d56Sopenharmony_ci                ordering.append('setUpClass')
7957db96d56Sopenharmony_ci            def testNothing(self):
7967db96d56Sopenharmony_ci                ordering.append('test')
7977db96d56Sopenharmony_ci            @classmethod
7987db96d56Sopenharmony_ci            def tearDownClass(cls):
7997db96d56Sopenharmony_ci                ordering.append('tearDownClass')
8007db96d56Sopenharmony_ci
8017db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module'
8027db96d56Sopenharmony_ci        sys.modules['Module'] = Module
8037db96d56Sopenharmony_ci        result = runTests(TestableTest)
8047db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
8057db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
8067db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
8077db96d56Sopenharmony_ci                                    'tearDownClass', 'tearDownModule',
8087db96d56Sopenharmony_ci                                    'cleanup_good'])
8097db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups, [])
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_ci    def test_debug_module_executes_cleanUp(self):
8127db96d56Sopenharmony_ci        ordering = []
8137db96d56Sopenharmony_ci        blowUp = False
8147db96d56Sopenharmony_ci        class Module(object):
8157db96d56Sopenharmony_ci            @staticmethod
8167db96d56Sopenharmony_ci            def setUpModule():
8177db96d56Sopenharmony_ci                ordering.append('setUpModule')
8187db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering, blowUp=blowUp)
8197db96d56Sopenharmony_ci            @staticmethod
8207db96d56Sopenharmony_ci            def tearDownModule():
8217db96d56Sopenharmony_ci                ordering.append('tearDownModule')
8227db96d56Sopenharmony_ci
8237db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
8247db96d56Sopenharmony_ci            @classmethod
8257db96d56Sopenharmony_ci            def setUpClass(cls):
8267db96d56Sopenharmony_ci                ordering.append('setUpClass')
8277db96d56Sopenharmony_ci            def testNothing(self):
8287db96d56Sopenharmony_ci                ordering.append('test')
8297db96d56Sopenharmony_ci            @classmethod
8307db96d56Sopenharmony_ci            def tearDownClass(cls):
8317db96d56Sopenharmony_ci                ordering.append('tearDownClass')
8327db96d56Sopenharmony_ci
8337db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module'
8347db96d56Sopenharmony_ci        sys.modules['Module'] = Module
8357db96d56Sopenharmony_ci        suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
8367db96d56Sopenharmony_ci        suite.debug()
8377db96d56Sopenharmony_ci        self.assertEqual(ordering,
8387db96d56Sopenharmony_ci                         ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
8397db96d56Sopenharmony_ci                          'tearDownModule', 'cleanup_good'])
8407db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups, [])
8417db96d56Sopenharmony_ci
8427db96d56Sopenharmony_ci        ordering = []
8437db96d56Sopenharmony_ci        blowUp = True
8447db96d56Sopenharmony_ci        suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
8457db96d56Sopenharmony_ci        with self.assertRaises(Exception) as cm:
8467db96d56Sopenharmony_ci            suite.debug()
8477db96d56Sopenharmony_ci        self.assertEqual(str(cm.exception), 'CleanUpExc')
8487db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
8497db96d56Sopenharmony_ci                                    'tearDownClass', 'tearDownModule', 'cleanup_exc'])
8507db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups, [])
8517db96d56Sopenharmony_ci
8527db96d56Sopenharmony_ci    def test_debug_module_cleanUp_when_teardown_exception(self):
8537db96d56Sopenharmony_ci        ordering = []
8547db96d56Sopenharmony_ci        blowUp = False
8557db96d56Sopenharmony_ci        class Module(object):
8567db96d56Sopenharmony_ci            @staticmethod
8577db96d56Sopenharmony_ci            def setUpModule():
8587db96d56Sopenharmony_ci                ordering.append('setUpModule')
8597db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering, blowUp=blowUp)
8607db96d56Sopenharmony_ci            @staticmethod
8617db96d56Sopenharmony_ci            def tearDownModule():
8627db96d56Sopenharmony_ci                ordering.append('tearDownModule')
8637db96d56Sopenharmony_ci                raise Exception('TearDownModuleExc')
8647db96d56Sopenharmony_ci
8657db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
8667db96d56Sopenharmony_ci            @classmethod
8677db96d56Sopenharmony_ci            def setUpClass(cls):
8687db96d56Sopenharmony_ci                ordering.append('setUpClass')
8697db96d56Sopenharmony_ci            def testNothing(self):
8707db96d56Sopenharmony_ci                ordering.append('test')
8717db96d56Sopenharmony_ci            @classmethod
8727db96d56Sopenharmony_ci            def tearDownClass(cls):
8737db96d56Sopenharmony_ci                ordering.append('tearDownClass')
8747db96d56Sopenharmony_ci
8757db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module'
8767db96d56Sopenharmony_ci        sys.modules['Module'] = Module
8777db96d56Sopenharmony_ci        suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
8787db96d56Sopenharmony_ci        with self.assertRaises(Exception) as cm:
8797db96d56Sopenharmony_ci            suite.debug()
8807db96d56Sopenharmony_ci        self.assertEqual(str(cm.exception), 'TearDownModuleExc')
8817db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
8827db96d56Sopenharmony_ci                                    'tearDownClass', 'tearDownModule'])
8837db96d56Sopenharmony_ci        self.assertTrue(unittest.case._module_cleanups)
8847db96d56Sopenharmony_ci        unittest.case._module_cleanups.clear()
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ci        ordering = []
8877db96d56Sopenharmony_ci        blowUp = True
8887db96d56Sopenharmony_ci        suite = unittest.defaultTestLoader.loadTestsFromTestCase(TestableTest)
8897db96d56Sopenharmony_ci        with self.assertRaises(Exception) as cm:
8907db96d56Sopenharmony_ci            suite.debug()
8917db96d56Sopenharmony_ci        self.assertEqual(str(cm.exception), 'TearDownModuleExc')
8927db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'test',
8937db96d56Sopenharmony_ci                                    'tearDownClass', 'tearDownModule'])
8947db96d56Sopenharmony_ci        self.assertTrue(unittest.case._module_cleanups)
8957db96d56Sopenharmony_ci        unittest.case._module_cleanups.clear()
8967db96d56Sopenharmony_ci
8977db96d56Sopenharmony_ci    def test_addClassCleanup_arg_errors(self):
8987db96d56Sopenharmony_ci        cleanups = []
8997db96d56Sopenharmony_ci        def cleanup(*args, **kwargs):
9007db96d56Sopenharmony_ci            cleanups.append((args, kwargs))
9017db96d56Sopenharmony_ci
9027db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
9037db96d56Sopenharmony_ci            @classmethod
9047db96d56Sopenharmony_ci            def setUpClass(cls):
9057db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, 1, 2, function=3, cls=4)
9067db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
9077db96d56Sopenharmony_ci                    cls.addClassCleanup(function=cleanup, arg='hello')
9087db96d56Sopenharmony_ci            def testNothing(self):
9097db96d56Sopenharmony_ci                pass
9107db96d56Sopenharmony_ci
9117db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9127db96d56Sopenharmony_ci            TestableTest.addClassCleanup()
9137db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9147db96d56Sopenharmony_ci            unittest.TestCase.addCleanup(cls=TestableTest(), function=cleanup)
9157db96d56Sopenharmony_ci        runTests(TestableTest)
9167db96d56Sopenharmony_ci        self.assertEqual(cleanups,
9177db96d56Sopenharmony_ci                         [((1, 2), {'function': 3, 'cls': 4})])
9187db96d56Sopenharmony_ci
9197db96d56Sopenharmony_ci    def test_addCleanup_arg_errors(self):
9207db96d56Sopenharmony_ci        cleanups = []
9217db96d56Sopenharmony_ci        def cleanup(*args, **kwargs):
9227db96d56Sopenharmony_ci            cleanups.append((args, kwargs))
9237db96d56Sopenharmony_ci
9247db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
9257db96d56Sopenharmony_ci            def setUp(self2):
9267db96d56Sopenharmony_ci                self2.addCleanup(cleanup, 1, 2, function=3, self=4)
9277db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
9287db96d56Sopenharmony_ci                    self2.addCleanup(function=cleanup, arg='hello')
9297db96d56Sopenharmony_ci            def testNothing(self):
9307db96d56Sopenharmony_ci                pass
9317db96d56Sopenharmony_ci
9327db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9337db96d56Sopenharmony_ci            TestableTest().addCleanup()
9347db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9357db96d56Sopenharmony_ci            unittest.TestCase.addCleanup(self=TestableTest(), function=cleanup)
9367db96d56Sopenharmony_ci        runTests(TestableTest)
9377db96d56Sopenharmony_ci        self.assertEqual(cleanups,
9387db96d56Sopenharmony_ci                         [((1, 2), {'function': 3, 'self': 4})])
9397db96d56Sopenharmony_ci
9407db96d56Sopenharmony_ci    def test_with_errors_in_addClassCleanup(self):
9417db96d56Sopenharmony_ci        ordering = []
9427db96d56Sopenharmony_ci
9437db96d56Sopenharmony_ci        class Module(object):
9447db96d56Sopenharmony_ci            @staticmethod
9457db96d56Sopenharmony_ci            def setUpModule():
9467db96d56Sopenharmony_ci                ordering.append('setUpModule')
9477db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering)
9487db96d56Sopenharmony_ci            @staticmethod
9497db96d56Sopenharmony_ci            def tearDownModule():
9507db96d56Sopenharmony_ci                ordering.append('tearDownModule')
9517db96d56Sopenharmony_ci
9527db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
9537db96d56Sopenharmony_ci            @classmethod
9547db96d56Sopenharmony_ci            def setUpClass(cls):
9557db96d56Sopenharmony_ci                ordering.append('setUpClass')
9567db96d56Sopenharmony_ci                cls.addClassCleanup(cleanup, ordering, blowUp=True)
9577db96d56Sopenharmony_ci            def testNothing(self):
9587db96d56Sopenharmony_ci                ordering.append('test')
9597db96d56Sopenharmony_ci            @classmethod
9607db96d56Sopenharmony_ci            def tearDownClass(cls):
9617db96d56Sopenharmony_ci                ordering.append('tearDownClass')
9627db96d56Sopenharmony_ci
9637db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module'
9647db96d56Sopenharmony_ci        sys.modules['Module'] = Module
9657db96d56Sopenharmony_ci
9667db96d56Sopenharmony_ci        result = runTests(TestableTest)
9677db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
9687db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
9697db96d56Sopenharmony_ci        self.assertEqual(ordering,
9707db96d56Sopenharmony_ci                         ['setUpModule', 'setUpClass', 'test', 'tearDownClass',
9717db96d56Sopenharmony_ci                          'cleanup_exc', 'tearDownModule', 'cleanup_good'])
9727db96d56Sopenharmony_ci
9737db96d56Sopenharmony_ci    def test_with_errors_in_addCleanup(self):
9747db96d56Sopenharmony_ci        ordering = []
9757db96d56Sopenharmony_ci        class Module(object):
9767db96d56Sopenharmony_ci            @staticmethod
9777db96d56Sopenharmony_ci            def setUpModule():
9787db96d56Sopenharmony_ci                ordering.append('setUpModule')
9797db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering)
9807db96d56Sopenharmony_ci            @staticmethod
9817db96d56Sopenharmony_ci            def tearDownModule():
9827db96d56Sopenharmony_ci                ordering.append('tearDownModule')
9837db96d56Sopenharmony_ci
9847db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
9857db96d56Sopenharmony_ci            def setUp(self):
9867db96d56Sopenharmony_ci                ordering.append('setUp')
9877db96d56Sopenharmony_ci                self.addCleanup(cleanup, ordering, blowUp=True)
9887db96d56Sopenharmony_ci            def testNothing(self):
9897db96d56Sopenharmony_ci                ordering.append('test')
9907db96d56Sopenharmony_ci            def tearDown(self):
9917db96d56Sopenharmony_ci                ordering.append('tearDown')
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module'
9947db96d56Sopenharmony_ci        sys.modules['Module'] = Module
9957db96d56Sopenharmony_ci
9967db96d56Sopenharmony_ci        result = runTests(TestableTest)
9977db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
9987db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
9997db96d56Sopenharmony_ci        self.assertEqual(ordering,
10007db96d56Sopenharmony_ci                         ['setUpModule', 'setUp', 'test', 'tearDown',
10017db96d56Sopenharmony_ci                          'cleanup_exc', 'tearDownModule', 'cleanup_good'])
10027db96d56Sopenharmony_ci
10037db96d56Sopenharmony_ci    def test_with_errors_in_addModuleCleanup_and_setUps(self):
10047db96d56Sopenharmony_ci        ordering = []
10057db96d56Sopenharmony_ci        module_blow_up = False
10067db96d56Sopenharmony_ci        class_blow_up = False
10077db96d56Sopenharmony_ci        method_blow_up = False
10087db96d56Sopenharmony_ci        class Module(object):
10097db96d56Sopenharmony_ci            @staticmethod
10107db96d56Sopenharmony_ci            def setUpModule():
10117db96d56Sopenharmony_ci                ordering.append('setUpModule')
10127db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup, ordering, blowUp=True)
10137db96d56Sopenharmony_ci                if module_blow_up:
10147db96d56Sopenharmony_ci                    raise Exception('ModuleExc')
10157db96d56Sopenharmony_ci            @staticmethod
10167db96d56Sopenharmony_ci            def tearDownModule():
10177db96d56Sopenharmony_ci                ordering.append('tearDownModule')
10187db96d56Sopenharmony_ci
10197db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
10207db96d56Sopenharmony_ci            @classmethod
10217db96d56Sopenharmony_ci            def setUpClass(cls):
10227db96d56Sopenharmony_ci                ordering.append('setUpClass')
10237db96d56Sopenharmony_ci                if class_blow_up:
10247db96d56Sopenharmony_ci                    raise Exception('ClassExc')
10257db96d56Sopenharmony_ci            def setUp(self):
10267db96d56Sopenharmony_ci                ordering.append('setUp')
10277db96d56Sopenharmony_ci                if method_blow_up:
10287db96d56Sopenharmony_ci                    raise Exception('MethodExc')
10297db96d56Sopenharmony_ci            def testNothing(self):
10307db96d56Sopenharmony_ci                ordering.append('test')
10317db96d56Sopenharmony_ci            @classmethod
10327db96d56Sopenharmony_ci            def tearDownClass(cls):
10337db96d56Sopenharmony_ci                ordering.append('tearDownClass')
10347db96d56Sopenharmony_ci
10357db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module'
10367db96d56Sopenharmony_ci        sys.modules['Module'] = Module
10377db96d56Sopenharmony_ci
10387db96d56Sopenharmony_ci        result = runTests(TestableTest)
10397db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
10407db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
10417db96d56Sopenharmony_ci        self.assertEqual(ordering,
10427db96d56Sopenharmony_ci                         ['setUpModule', 'setUpClass', 'setUp', 'test',
10437db96d56Sopenharmony_ci                          'tearDownClass', 'tearDownModule',
10447db96d56Sopenharmony_ci                          'cleanup_exc'])
10457db96d56Sopenharmony_ci
10467db96d56Sopenharmony_ci        ordering = []
10477db96d56Sopenharmony_ci        module_blow_up = True
10487db96d56Sopenharmony_ci        class_blow_up = False
10497db96d56Sopenharmony_ci        method_blow_up = False
10507db96d56Sopenharmony_ci        result = runTests(TestableTest)
10517db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
10527db96d56Sopenharmony_ci                         'Exception: ModuleExc')
10537db96d56Sopenharmony_ci        self.assertEqual(result.errors[1][1].splitlines()[-1],
10547db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
10557db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'cleanup_exc'])
10567db96d56Sopenharmony_ci
10577db96d56Sopenharmony_ci        ordering = []
10587db96d56Sopenharmony_ci        module_blow_up = False
10597db96d56Sopenharmony_ci        class_blow_up = True
10607db96d56Sopenharmony_ci        method_blow_up = False
10617db96d56Sopenharmony_ci        result = runTests(TestableTest)
10627db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
10637db96d56Sopenharmony_ci                         'Exception: ClassExc')
10647db96d56Sopenharmony_ci        self.assertEqual(result.errors[1][1].splitlines()[-1],
10657db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
10667db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'setUpClass',
10677db96d56Sopenharmony_ci                                    'tearDownModule', 'cleanup_exc'])
10687db96d56Sopenharmony_ci
10697db96d56Sopenharmony_ci        ordering = []
10707db96d56Sopenharmony_ci        module_blow_up = False
10717db96d56Sopenharmony_ci        class_blow_up = False
10727db96d56Sopenharmony_ci        method_blow_up = True
10737db96d56Sopenharmony_ci        result = runTests(TestableTest)
10747db96d56Sopenharmony_ci        self.assertEqual(result.errors[0][1].splitlines()[-1],
10757db96d56Sopenharmony_ci                         'Exception: MethodExc')
10767db96d56Sopenharmony_ci        self.assertEqual(result.errors[1][1].splitlines()[-1],
10777db96d56Sopenharmony_ci                         'Exception: CleanUpExc')
10787db96d56Sopenharmony_ci        self.assertEqual(ordering, ['setUpModule', 'setUpClass', 'setUp',
10797db96d56Sopenharmony_ci                                    'tearDownClass', 'tearDownModule',
10807db96d56Sopenharmony_ci                                    'cleanup_exc'])
10817db96d56Sopenharmony_ci
10827db96d56Sopenharmony_ci    def test_module_cleanUp_with_multiple_classes(self):
10837db96d56Sopenharmony_ci        ordering =[]
10847db96d56Sopenharmony_ci        def cleanup1():
10857db96d56Sopenharmony_ci            ordering.append('cleanup1')
10867db96d56Sopenharmony_ci
10877db96d56Sopenharmony_ci        def cleanup2():
10887db96d56Sopenharmony_ci            ordering.append('cleanup2')
10897db96d56Sopenharmony_ci
10907db96d56Sopenharmony_ci        def cleanup3():
10917db96d56Sopenharmony_ci            ordering.append('cleanup3')
10927db96d56Sopenharmony_ci
10937db96d56Sopenharmony_ci        class Module(object):
10947db96d56Sopenharmony_ci            @staticmethod
10957db96d56Sopenharmony_ci            def setUpModule():
10967db96d56Sopenharmony_ci                ordering.append('setUpModule')
10977db96d56Sopenharmony_ci                unittest.addModuleCleanup(cleanup1)
10987db96d56Sopenharmony_ci            @staticmethod
10997db96d56Sopenharmony_ci            def tearDownModule():
11007db96d56Sopenharmony_ci                ordering.append('tearDownModule')
11017db96d56Sopenharmony_ci
11027db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
11037db96d56Sopenharmony_ci            def setUp(self):
11047db96d56Sopenharmony_ci                ordering.append('setUp')
11057db96d56Sopenharmony_ci                self.addCleanup(cleanup2)
11067db96d56Sopenharmony_ci            def testNothing(self):
11077db96d56Sopenharmony_ci                ordering.append('test')
11087db96d56Sopenharmony_ci            def tearDown(self):
11097db96d56Sopenharmony_ci                ordering.append('tearDown')
11107db96d56Sopenharmony_ci
11117db96d56Sopenharmony_ci        class OtherTestableTest(unittest.TestCase):
11127db96d56Sopenharmony_ci            def setUp(self):
11137db96d56Sopenharmony_ci                ordering.append('setUp2')
11147db96d56Sopenharmony_ci                self.addCleanup(cleanup3)
11157db96d56Sopenharmony_ci            def testNothing(self):
11167db96d56Sopenharmony_ci                ordering.append('test2')
11177db96d56Sopenharmony_ci            def tearDown(self):
11187db96d56Sopenharmony_ci                ordering.append('tearDown2')
11197db96d56Sopenharmony_ci
11207db96d56Sopenharmony_ci        TestableTest.__module__ = 'Module'
11217db96d56Sopenharmony_ci        OtherTestableTest.__module__ = 'Module'
11227db96d56Sopenharmony_ci        sys.modules['Module'] = Module
11237db96d56Sopenharmony_ci        runTests(TestableTest, OtherTestableTest)
11247db96d56Sopenharmony_ci        self.assertEqual(ordering,
11257db96d56Sopenharmony_ci                         ['setUpModule', 'setUp', 'test', 'tearDown',
11267db96d56Sopenharmony_ci                          'cleanup2',  'setUp2', 'test2', 'tearDown2',
11277db96d56Sopenharmony_ci                          'cleanup3', 'tearDownModule', 'cleanup1'])
11287db96d56Sopenharmony_ci
11297db96d56Sopenharmony_ci    def test_enterModuleContext(self):
11307db96d56Sopenharmony_ci        cleanups = []
11317db96d56Sopenharmony_ci
11327db96d56Sopenharmony_ci        unittest.addModuleCleanup(cleanups.append, 'cleanup1')
11337db96d56Sopenharmony_ci        cm = TestCM(cleanups, 42)
11347db96d56Sopenharmony_ci        self.assertEqual(unittest.enterModuleContext(cm), 42)
11357db96d56Sopenharmony_ci        unittest.addModuleCleanup(cleanups.append, 'cleanup2')
11367db96d56Sopenharmony_ci
11377db96d56Sopenharmony_ci        unittest.case.doModuleCleanups()
11387db96d56Sopenharmony_ci        self.assertEqual(cleanups, ['enter', 'cleanup2', 'exit', 'cleanup1'])
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ci    def test_enterModuleContext_arg_errors(self):
11417db96d56Sopenharmony_ci        class TestableTest(unittest.TestCase):
11427db96d56Sopenharmony_ci            def testNothing(self):
11437db96d56Sopenharmony_ci                pass
11447db96d56Sopenharmony_ci
11457db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'the context manager'):
11467db96d56Sopenharmony_ci            unittest.enterModuleContext(LacksEnterAndExit())
11477db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'the context manager'):
11487db96d56Sopenharmony_ci            unittest.enterModuleContext(LacksEnter())
11497db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'the context manager'):
11507db96d56Sopenharmony_ci            unittest.enterModuleContext(LacksExit())
11517db96d56Sopenharmony_ci
11527db96d56Sopenharmony_ci        self.assertEqual(unittest.case._module_cleanups, [])
11537db96d56Sopenharmony_ci
11547db96d56Sopenharmony_ci
11557db96d56Sopenharmony_ciclass Test_TextTestRunner(unittest.TestCase):
11567db96d56Sopenharmony_ci    """Tests for TextTestRunner."""
11577db96d56Sopenharmony_ci
11587db96d56Sopenharmony_ci    def setUp(self):
11597db96d56Sopenharmony_ci        # clean the environment from pre-existing PYTHONWARNINGS to make
11607db96d56Sopenharmony_ci        # test_warnings results consistent
11617db96d56Sopenharmony_ci        self.pythonwarnings = os.environ.get('PYTHONWARNINGS')
11627db96d56Sopenharmony_ci        if self.pythonwarnings:
11637db96d56Sopenharmony_ci            del os.environ['PYTHONWARNINGS']
11647db96d56Sopenharmony_ci
11657db96d56Sopenharmony_ci    def tearDown(self):
11667db96d56Sopenharmony_ci        # bring back pre-existing PYTHONWARNINGS if present
11677db96d56Sopenharmony_ci        if self.pythonwarnings:
11687db96d56Sopenharmony_ci            os.environ['PYTHONWARNINGS'] = self.pythonwarnings
11697db96d56Sopenharmony_ci
11707db96d56Sopenharmony_ci    def test_init(self):
11717db96d56Sopenharmony_ci        runner = unittest.TextTestRunner()
11727db96d56Sopenharmony_ci        self.assertFalse(runner.failfast)
11737db96d56Sopenharmony_ci        self.assertFalse(runner.buffer)
11747db96d56Sopenharmony_ci        self.assertEqual(runner.verbosity, 1)
11757db96d56Sopenharmony_ci        self.assertEqual(runner.warnings, None)
11767db96d56Sopenharmony_ci        self.assertTrue(runner.descriptions)
11777db96d56Sopenharmony_ci        self.assertEqual(runner.resultclass, unittest.TextTestResult)
11787db96d56Sopenharmony_ci        self.assertFalse(runner.tb_locals)
11797db96d56Sopenharmony_ci
11807db96d56Sopenharmony_ci    def test_multiple_inheritance(self):
11817db96d56Sopenharmony_ci        class AResult(unittest.TestResult):
11827db96d56Sopenharmony_ci            def __init__(self, stream, descriptions, verbosity):
11837db96d56Sopenharmony_ci                super(AResult, self).__init__(stream, descriptions, verbosity)
11847db96d56Sopenharmony_ci
11857db96d56Sopenharmony_ci        class ATextResult(unittest.TextTestResult, AResult):
11867db96d56Sopenharmony_ci            pass
11877db96d56Sopenharmony_ci
11887db96d56Sopenharmony_ci        # This used to raise an exception due to TextTestResult not passing
11897db96d56Sopenharmony_ci        # on arguments in its __init__ super call
11907db96d56Sopenharmony_ci        ATextResult(None, None, 1)
11917db96d56Sopenharmony_ci
11927db96d56Sopenharmony_ci    def testBufferAndFailfast(self):
11937db96d56Sopenharmony_ci        class Test(unittest.TestCase):
11947db96d56Sopenharmony_ci            def testFoo(self):
11957db96d56Sopenharmony_ci                pass
11967db96d56Sopenharmony_ci        result = unittest.TestResult()
11977db96d56Sopenharmony_ci        runner = unittest.TextTestRunner(stream=io.StringIO(), failfast=True,
11987db96d56Sopenharmony_ci                                         buffer=True)
11997db96d56Sopenharmony_ci        # Use our result object
12007db96d56Sopenharmony_ci        runner._makeResult = lambda: result
12017db96d56Sopenharmony_ci        runner.run(Test('testFoo'))
12027db96d56Sopenharmony_ci
12037db96d56Sopenharmony_ci        self.assertTrue(result.failfast)
12047db96d56Sopenharmony_ci        self.assertTrue(result.buffer)
12057db96d56Sopenharmony_ci
12067db96d56Sopenharmony_ci    def test_locals(self):
12077db96d56Sopenharmony_ci        runner = unittest.TextTestRunner(stream=io.StringIO(), tb_locals=True)
12087db96d56Sopenharmony_ci        result = runner.run(unittest.TestSuite())
12097db96d56Sopenharmony_ci        self.assertEqual(True, result.tb_locals)
12107db96d56Sopenharmony_ci
12117db96d56Sopenharmony_ci    def testRunnerRegistersResult(self):
12127db96d56Sopenharmony_ci        class Test(unittest.TestCase):
12137db96d56Sopenharmony_ci            def testFoo(self):
12147db96d56Sopenharmony_ci                pass
12157db96d56Sopenharmony_ci        originalRegisterResult = unittest.runner.registerResult
12167db96d56Sopenharmony_ci        def cleanup():
12177db96d56Sopenharmony_ci            unittest.runner.registerResult = originalRegisterResult
12187db96d56Sopenharmony_ci        self.addCleanup(cleanup)
12197db96d56Sopenharmony_ci
12207db96d56Sopenharmony_ci        result = unittest.TestResult()
12217db96d56Sopenharmony_ci        runner = unittest.TextTestRunner(stream=io.StringIO())
12227db96d56Sopenharmony_ci        # Use our result object
12237db96d56Sopenharmony_ci        runner._makeResult = lambda: result
12247db96d56Sopenharmony_ci
12257db96d56Sopenharmony_ci        self.wasRegistered = 0
12267db96d56Sopenharmony_ci        def fakeRegisterResult(thisResult):
12277db96d56Sopenharmony_ci            self.wasRegistered += 1
12287db96d56Sopenharmony_ci            self.assertEqual(thisResult, result)
12297db96d56Sopenharmony_ci        unittest.runner.registerResult = fakeRegisterResult
12307db96d56Sopenharmony_ci
12317db96d56Sopenharmony_ci        runner.run(unittest.TestSuite())
12327db96d56Sopenharmony_ci        self.assertEqual(self.wasRegistered, 1)
12337db96d56Sopenharmony_ci
12347db96d56Sopenharmony_ci    def test_works_with_result_without_startTestRun_stopTestRun(self):
12357db96d56Sopenharmony_ci        class OldTextResult(ResultWithNoStartTestRunStopTestRun):
12367db96d56Sopenharmony_ci            separator2 = ''
12377db96d56Sopenharmony_ci            def printErrors(self):
12387db96d56Sopenharmony_ci                pass
12397db96d56Sopenharmony_ci
12407db96d56Sopenharmony_ci        class Runner(unittest.TextTestRunner):
12417db96d56Sopenharmony_ci            def __init__(self):
12427db96d56Sopenharmony_ci                super(Runner, self).__init__(io.StringIO())
12437db96d56Sopenharmony_ci
12447db96d56Sopenharmony_ci            def _makeResult(self):
12457db96d56Sopenharmony_ci                return OldTextResult()
12467db96d56Sopenharmony_ci
12477db96d56Sopenharmony_ci        runner = Runner()
12487db96d56Sopenharmony_ci        runner.run(unittest.TestSuite())
12497db96d56Sopenharmony_ci
12507db96d56Sopenharmony_ci    def test_startTestRun_stopTestRun_called(self):
12517db96d56Sopenharmony_ci        class LoggingTextResult(LoggingResult):
12527db96d56Sopenharmony_ci            separator2 = ''
12537db96d56Sopenharmony_ci            def printErrors(self):
12547db96d56Sopenharmony_ci                pass
12557db96d56Sopenharmony_ci
12567db96d56Sopenharmony_ci        class LoggingRunner(unittest.TextTestRunner):
12577db96d56Sopenharmony_ci            def __init__(self, events):
12587db96d56Sopenharmony_ci                super(LoggingRunner, self).__init__(io.StringIO())
12597db96d56Sopenharmony_ci                self._events = events
12607db96d56Sopenharmony_ci
12617db96d56Sopenharmony_ci            def _makeResult(self):
12627db96d56Sopenharmony_ci                return LoggingTextResult(self._events)
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_ci        events = []
12657db96d56Sopenharmony_ci        runner = LoggingRunner(events)
12667db96d56Sopenharmony_ci        runner.run(unittest.TestSuite())
12677db96d56Sopenharmony_ci        expected = ['startTestRun', 'stopTestRun']
12687db96d56Sopenharmony_ci        self.assertEqual(events, expected)
12697db96d56Sopenharmony_ci
12707db96d56Sopenharmony_ci    def test_pickle_unpickle(self):
12717db96d56Sopenharmony_ci        # Issue #7197: a TextTestRunner should be (un)pickleable. This is
12727db96d56Sopenharmony_ci        # required by test_multiprocessing under Windows (in verbose mode).
12737db96d56Sopenharmony_ci        stream = io.StringIO("foo")
12747db96d56Sopenharmony_ci        runner = unittest.TextTestRunner(stream)
12757db96d56Sopenharmony_ci        for protocol in range(2, pickle.HIGHEST_PROTOCOL + 1):
12767db96d56Sopenharmony_ci            s = pickle.dumps(runner, protocol)
12777db96d56Sopenharmony_ci            obj = pickle.loads(s)
12787db96d56Sopenharmony_ci            # StringIO objects never compare equal, a cheap test instead.
12797db96d56Sopenharmony_ci            self.assertEqual(obj.stream.getvalue(), stream.getvalue())
12807db96d56Sopenharmony_ci
12817db96d56Sopenharmony_ci    def test_resultclass(self):
12827db96d56Sopenharmony_ci        def MockResultClass(*args):
12837db96d56Sopenharmony_ci            return args
12847db96d56Sopenharmony_ci        STREAM = object()
12857db96d56Sopenharmony_ci        DESCRIPTIONS = object()
12867db96d56Sopenharmony_ci        VERBOSITY = object()
12877db96d56Sopenharmony_ci        runner = unittest.TextTestRunner(STREAM, DESCRIPTIONS, VERBOSITY,
12887db96d56Sopenharmony_ci                                         resultclass=MockResultClass)
12897db96d56Sopenharmony_ci        self.assertEqual(runner.resultclass, MockResultClass)
12907db96d56Sopenharmony_ci
12917db96d56Sopenharmony_ci        expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY)
12927db96d56Sopenharmony_ci        self.assertEqual(runner._makeResult(), expectedresult)
12937db96d56Sopenharmony_ci
12947db96d56Sopenharmony_ci    @support.requires_subprocess()
12957db96d56Sopenharmony_ci    def test_warnings(self):
12967db96d56Sopenharmony_ci        """
12977db96d56Sopenharmony_ci        Check that warnings argument of TextTestRunner correctly affects the
12987db96d56Sopenharmony_ci        behavior of the warnings.
12997db96d56Sopenharmony_ci        """
13007db96d56Sopenharmony_ci        # see #10535 and the _test_warnings file for more information
13017db96d56Sopenharmony_ci
13027db96d56Sopenharmony_ci        def get_parse_out_err(p):
13037db96d56Sopenharmony_ci            return [b.splitlines() for b in p.communicate()]
13047db96d56Sopenharmony_ci        opts = dict(stdout=subprocess.PIPE, stderr=subprocess.PIPE,
13057db96d56Sopenharmony_ci                    cwd=os.path.dirname(__file__))
13067db96d56Sopenharmony_ci        ae_msg = b'Please use assertEqual instead.'
13077db96d56Sopenharmony_ci        at_msg = b'Please use assertTrue instead.'
13087db96d56Sopenharmony_ci
13097db96d56Sopenharmony_ci        # no args -> all the warnings are printed, unittest warnings only once
13107db96d56Sopenharmony_ci        p = subprocess.Popen([sys.executable, '-E', '_test_warnings.py'], **opts)
13117db96d56Sopenharmony_ci        with p:
13127db96d56Sopenharmony_ci            out, err = get_parse_out_err(p)
13137db96d56Sopenharmony_ci        self.assertIn(b'OK', err)
13147db96d56Sopenharmony_ci        # check that the total number of warnings in the output is correct
13157db96d56Sopenharmony_ci        self.assertEqual(len(out), 12)
13167db96d56Sopenharmony_ci        # check that the numbers of the different kind of warnings is correct
13177db96d56Sopenharmony_ci        for msg in [b'dw', b'iw', b'uw']:
13187db96d56Sopenharmony_ci            self.assertEqual(out.count(msg), 3)
13197db96d56Sopenharmony_ci        for msg in [ae_msg, at_msg, b'rw']:
13207db96d56Sopenharmony_ci            self.assertEqual(out.count(msg), 1)
13217db96d56Sopenharmony_ci
13227db96d56Sopenharmony_ci        args_list = (
13237db96d56Sopenharmony_ci            # passing 'ignore' as warnings arg -> no warnings
13247db96d56Sopenharmony_ci            [sys.executable, '_test_warnings.py', 'ignore'],
13257db96d56Sopenharmony_ci            # -W doesn't affect the result if the arg is passed
13267db96d56Sopenharmony_ci            [sys.executable, '-Wa', '_test_warnings.py', 'ignore'],
13277db96d56Sopenharmony_ci            # -W affects the result if the arg is not passed
13287db96d56Sopenharmony_ci            [sys.executable, '-Wi', '_test_warnings.py']
13297db96d56Sopenharmony_ci        )
13307db96d56Sopenharmony_ci        # in all these cases no warnings are printed
13317db96d56Sopenharmony_ci        for args in args_list:
13327db96d56Sopenharmony_ci            p = subprocess.Popen(args, **opts)
13337db96d56Sopenharmony_ci            with p:
13347db96d56Sopenharmony_ci                out, err = get_parse_out_err(p)
13357db96d56Sopenharmony_ci            self.assertIn(b'OK', err)
13367db96d56Sopenharmony_ci            self.assertEqual(len(out), 0)
13377db96d56Sopenharmony_ci
13387db96d56Sopenharmony_ci
13397db96d56Sopenharmony_ci        # passing 'always' as warnings arg -> all the warnings printed,
13407db96d56Sopenharmony_ci        #                                     unittest warnings only once
13417db96d56Sopenharmony_ci        p = subprocess.Popen([sys.executable, '_test_warnings.py', 'always'],
13427db96d56Sopenharmony_ci                             **opts)
13437db96d56Sopenharmony_ci        with p:
13447db96d56Sopenharmony_ci            out, err = get_parse_out_err(p)
13457db96d56Sopenharmony_ci        self.assertIn(b'OK', err)
13467db96d56Sopenharmony_ci        self.assertEqual(len(out), 14)
13477db96d56Sopenharmony_ci        for msg in [b'dw', b'iw', b'uw', b'rw']:
13487db96d56Sopenharmony_ci            self.assertEqual(out.count(msg), 3)
13497db96d56Sopenharmony_ci        for msg in [ae_msg, at_msg]:
13507db96d56Sopenharmony_ci            self.assertEqual(out.count(msg), 1)
13517db96d56Sopenharmony_ci
13527db96d56Sopenharmony_ci    def testStdErrLookedUpAtInstantiationTime(self):
13537db96d56Sopenharmony_ci        # see issue 10786
13547db96d56Sopenharmony_ci        old_stderr = sys.stderr
13557db96d56Sopenharmony_ci        f = io.StringIO()
13567db96d56Sopenharmony_ci        sys.stderr = f
13577db96d56Sopenharmony_ci        try:
13587db96d56Sopenharmony_ci            runner = unittest.TextTestRunner()
13597db96d56Sopenharmony_ci            self.assertTrue(runner.stream.stream is f)
13607db96d56Sopenharmony_ci        finally:
13617db96d56Sopenharmony_ci            sys.stderr = old_stderr
13627db96d56Sopenharmony_ci
13637db96d56Sopenharmony_ci    def testSpecifiedStreamUsed(self):
13647db96d56Sopenharmony_ci        # see issue 10786
13657db96d56Sopenharmony_ci        f = io.StringIO()
13667db96d56Sopenharmony_ci        runner = unittest.TextTestRunner(f)
13677db96d56Sopenharmony_ci        self.assertTrue(runner.stream.stream is f)
13687db96d56Sopenharmony_ci
13697db96d56Sopenharmony_ci
13707db96d56Sopenharmony_ciif __name__ == "__main__":
13717db96d56Sopenharmony_ci    unittest.main()
1372