17db96d56Sopenharmony_cifrom contextlib import contextmanager
27db96d56Sopenharmony_ciimport linecache
37db96d56Sopenharmony_ciimport os
47db96d56Sopenharmony_cifrom io import StringIO
57db96d56Sopenharmony_ciimport re
67db96d56Sopenharmony_ciimport sys
77db96d56Sopenharmony_ciimport textwrap
87db96d56Sopenharmony_ciimport unittest
97db96d56Sopenharmony_cifrom test import support
107db96d56Sopenharmony_cifrom test.support import import_helper
117db96d56Sopenharmony_cifrom test.support import os_helper
127db96d56Sopenharmony_cifrom test.support import warnings_helper
137db96d56Sopenharmony_cifrom test.support.script_helper import assert_python_ok, assert_python_failure
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_cifrom test.test_warnings.data import stacklevel as warning_tests
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ciimport warnings as original_warnings
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_cipy_warnings = import_helper.import_fresh_module('warnings',
217db96d56Sopenharmony_ci                                                blocked=['_warnings'])
227db96d56Sopenharmony_cic_warnings = import_helper.import_fresh_module('warnings',
237db96d56Sopenharmony_ci                                               fresh=['_warnings'])
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ciPy_DEBUG = hasattr(sys, 'gettotalrefcount')
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci@contextmanager
287db96d56Sopenharmony_cidef warnings_state(module):
297db96d56Sopenharmony_ci    """Use a specific warnings implementation in warning_tests."""
307db96d56Sopenharmony_ci    global __warningregistry__
317db96d56Sopenharmony_ci    for to_clear in (sys, warning_tests):
327db96d56Sopenharmony_ci        try:
337db96d56Sopenharmony_ci            to_clear.__warningregistry__.clear()
347db96d56Sopenharmony_ci        except AttributeError:
357db96d56Sopenharmony_ci            pass
367db96d56Sopenharmony_ci    try:
377db96d56Sopenharmony_ci        __warningregistry__.clear()
387db96d56Sopenharmony_ci    except NameError:
397db96d56Sopenharmony_ci        pass
407db96d56Sopenharmony_ci    original_warnings = warning_tests.warnings
417db96d56Sopenharmony_ci    original_filters = module.filters
427db96d56Sopenharmony_ci    try:
437db96d56Sopenharmony_ci        module.filters = original_filters[:]
447db96d56Sopenharmony_ci        module.simplefilter("once")
457db96d56Sopenharmony_ci        warning_tests.warnings = module
467db96d56Sopenharmony_ci        yield
477db96d56Sopenharmony_ci    finally:
487db96d56Sopenharmony_ci        warning_tests.warnings = original_warnings
497db96d56Sopenharmony_ci        module.filters = original_filters
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ciclass TestWarning(Warning):
537db96d56Sopenharmony_ci    pass
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ciclass BaseTest:
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    """Basic bookkeeping required for testing."""
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    def setUp(self):
617db96d56Sopenharmony_ci        self.old_unittest_module = unittest.case.warnings
627db96d56Sopenharmony_ci        # The __warningregistry__ needs to be in a pristine state for tests
637db96d56Sopenharmony_ci        # to work properly.
647db96d56Sopenharmony_ci        if '__warningregistry__' in globals():
657db96d56Sopenharmony_ci            del globals()['__warningregistry__']
667db96d56Sopenharmony_ci        if hasattr(warning_tests, '__warningregistry__'):
677db96d56Sopenharmony_ci            del warning_tests.__warningregistry__
687db96d56Sopenharmony_ci        if hasattr(sys, '__warningregistry__'):
697db96d56Sopenharmony_ci            del sys.__warningregistry__
707db96d56Sopenharmony_ci        # The 'warnings' module must be explicitly set so that the proper
717db96d56Sopenharmony_ci        # interaction between _warnings and 'warnings' can be controlled.
727db96d56Sopenharmony_ci        sys.modules['warnings'] = self.module
737db96d56Sopenharmony_ci        # Ensure that unittest.TestCase.assertWarns() uses the same warnings
747db96d56Sopenharmony_ci        # module than warnings.catch_warnings(). Otherwise,
757db96d56Sopenharmony_ci        # warnings.catch_warnings() will be unable to remove the added filter.
767db96d56Sopenharmony_ci        unittest.case.warnings = self.module
777db96d56Sopenharmony_ci        super(BaseTest, self).setUp()
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci    def tearDown(self):
807db96d56Sopenharmony_ci        sys.modules['warnings'] = original_warnings
817db96d56Sopenharmony_ci        unittest.case.warnings = self.old_unittest_module
827db96d56Sopenharmony_ci        super(BaseTest, self).tearDown()
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ciclass PublicAPITests(BaseTest):
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci    """Ensures that the correct values are exposed in the
877db96d56Sopenharmony_ci    public API.
887db96d56Sopenharmony_ci    """
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci    def test_module_all_attribute(self):
917db96d56Sopenharmony_ci        self.assertTrue(hasattr(self.module, '__all__'))
927db96d56Sopenharmony_ci        target_api = ["warn", "warn_explicit", "showwarning",
937db96d56Sopenharmony_ci                      "formatwarning", "filterwarnings", "simplefilter",
947db96d56Sopenharmony_ci                      "resetwarnings", "catch_warnings"]
957db96d56Sopenharmony_ci        self.assertSetEqual(set(self.module.__all__),
967db96d56Sopenharmony_ci                            set(target_api))
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ciclass CPublicAPITests(PublicAPITests, unittest.TestCase):
997db96d56Sopenharmony_ci    module = c_warnings
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ciclass PyPublicAPITests(PublicAPITests, unittest.TestCase):
1027db96d56Sopenharmony_ci    module = py_warnings
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ciclass FilterTests(BaseTest):
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci    """Testing the filtering functionality."""
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci    def test_error(self):
1097db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module) as w:
1107db96d56Sopenharmony_ci            self.module.resetwarnings()
1117db96d56Sopenharmony_ci            self.module.filterwarnings("error", category=UserWarning)
1127db96d56Sopenharmony_ci            self.assertRaises(UserWarning, self.module.warn,
1137db96d56Sopenharmony_ci                                "FilterTests.test_error")
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci    def test_error_after_default(self):
1167db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module) as w:
1177db96d56Sopenharmony_ci            self.module.resetwarnings()
1187db96d56Sopenharmony_ci            message = "FilterTests.test_ignore_after_default"
1197db96d56Sopenharmony_ci            def f():
1207db96d56Sopenharmony_ci                self.module.warn(message, UserWarning)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci            with support.captured_stderr() as stderr:
1237db96d56Sopenharmony_ci                f()
1247db96d56Sopenharmony_ci            stderr = stderr.getvalue()
1257db96d56Sopenharmony_ci            self.assertIn("UserWarning: FilterTests.test_ignore_after_default",
1267db96d56Sopenharmony_ci                          stderr)
1277db96d56Sopenharmony_ci            self.assertIn("self.module.warn(message, UserWarning)",
1287db96d56Sopenharmony_ci                          stderr)
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci            self.module.filterwarnings("error", category=UserWarning)
1317db96d56Sopenharmony_ci            self.assertRaises(UserWarning, f)
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci    def test_ignore(self):
1347db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
1357db96d56Sopenharmony_ci                module=self.module) as w:
1367db96d56Sopenharmony_ci            self.module.resetwarnings()
1377db96d56Sopenharmony_ci            self.module.filterwarnings("ignore", category=UserWarning)
1387db96d56Sopenharmony_ci            self.module.warn("FilterTests.test_ignore", UserWarning)
1397db96d56Sopenharmony_ci            self.assertEqual(len(w), 0)
1407db96d56Sopenharmony_ci            self.assertEqual(list(__warningregistry__), ['version'])
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci    def test_ignore_after_default(self):
1437db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
1447db96d56Sopenharmony_ci                module=self.module) as w:
1457db96d56Sopenharmony_ci            self.module.resetwarnings()
1467db96d56Sopenharmony_ci            message = "FilterTests.test_ignore_after_default"
1477db96d56Sopenharmony_ci            def f():
1487db96d56Sopenharmony_ci                self.module.warn(message, UserWarning)
1497db96d56Sopenharmony_ci            f()
1507db96d56Sopenharmony_ci            self.module.filterwarnings("ignore", category=UserWarning)
1517db96d56Sopenharmony_ci            f()
1527db96d56Sopenharmony_ci            f()
1537db96d56Sopenharmony_ci            self.assertEqual(len(w), 1)
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci    def test_always(self):
1567db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
1577db96d56Sopenharmony_ci                module=self.module) as w:
1587db96d56Sopenharmony_ci            self.module.resetwarnings()
1597db96d56Sopenharmony_ci            self.module.filterwarnings("always", category=UserWarning)
1607db96d56Sopenharmony_ci            message = "FilterTests.test_always"
1617db96d56Sopenharmony_ci            def f():
1627db96d56Sopenharmony_ci                self.module.warn(message, UserWarning)
1637db96d56Sopenharmony_ci            f()
1647db96d56Sopenharmony_ci            self.assertEqual(len(w), 1)
1657db96d56Sopenharmony_ci            self.assertEqual(w[-1].message.args[0], message)
1667db96d56Sopenharmony_ci            f()
1677db96d56Sopenharmony_ci            self.assertEqual(len(w), 2)
1687db96d56Sopenharmony_ci            self.assertEqual(w[-1].message.args[0], message)
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci    def test_always_after_default(self):
1717db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
1727db96d56Sopenharmony_ci                module=self.module) as w:
1737db96d56Sopenharmony_ci            self.module.resetwarnings()
1747db96d56Sopenharmony_ci            message = "FilterTests.test_always_after_ignore"
1757db96d56Sopenharmony_ci            def f():
1767db96d56Sopenharmony_ci                self.module.warn(message, UserWarning)
1777db96d56Sopenharmony_ci            f()
1787db96d56Sopenharmony_ci            self.assertEqual(len(w), 1)
1797db96d56Sopenharmony_ci            self.assertEqual(w[-1].message.args[0], message)
1807db96d56Sopenharmony_ci            f()
1817db96d56Sopenharmony_ci            self.assertEqual(len(w), 1)
1827db96d56Sopenharmony_ci            self.module.filterwarnings("always", category=UserWarning)
1837db96d56Sopenharmony_ci            f()
1847db96d56Sopenharmony_ci            self.assertEqual(len(w), 2)
1857db96d56Sopenharmony_ci            self.assertEqual(w[-1].message.args[0], message)
1867db96d56Sopenharmony_ci            f()
1877db96d56Sopenharmony_ci            self.assertEqual(len(w), 3)
1887db96d56Sopenharmony_ci            self.assertEqual(w[-1].message.args[0], message)
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci    def test_default(self):
1917db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
1927db96d56Sopenharmony_ci                module=self.module) as w:
1937db96d56Sopenharmony_ci            self.module.resetwarnings()
1947db96d56Sopenharmony_ci            self.module.filterwarnings("default", category=UserWarning)
1957db96d56Sopenharmony_ci            message = UserWarning("FilterTests.test_default")
1967db96d56Sopenharmony_ci            for x in range(2):
1977db96d56Sopenharmony_ci                self.module.warn(message, UserWarning)
1987db96d56Sopenharmony_ci                if x == 0:
1997db96d56Sopenharmony_ci                    self.assertEqual(w[-1].message, message)
2007db96d56Sopenharmony_ci                    del w[:]
2017db96d56Sopenharmony_ci                elif x == 1:
2027db96d56Sopenharmony_ci                    self.assertEqual(len(w), 0)
2037db96d56Sopenharmony_ci                else:
2047db96d56Sopenharmony_ci                    raise ValueError("loop variant unhandled")
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci    def test_module(self):
2077db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
2087db96d56Sopenharmony_ci                module=self.module) as w:
2097db96d56Sopenharmony_ci            self.module.resetwarnings()
2107db96d56Sopenharmony_ci            self.module.filterwarnings("module", category=UserWarning)
2117db96d56Sopenharmony_ci            message = UserWarning("FilterTests.test_module")
2127db96d56Sopenharmony_ci            self.module.warn(message, UserWarning)
2137db96d56Sopenharmony_ci            self.assertEqual(w[-1].message, message)
2147db96d56Sopenharmony_ci            del w[:]
2157db96d56Sopenharmony_ci            self.module.warn(message, UserWarning)
2167db96d56Sopenharmony_ci            self.assertEqual(len(w), 0)
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci    def test_once(self):
2197db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
2207db96d56Sopenharmony_ci                module=self.module) as w:
2217db96d56Sopenharmony_ci            self.module.resetwarnings()
2227db96d56Sopenharmony_ci            self.module.filterwarnings("once", category=UserWarning)
2237db96d56Sopenharmony_ci            message = UserWarning("FilterTests.test_once")
2247db96d56Sopenharmony_ci            self.module.warn_explicit(message, UserWarning, "__init__.py",
2257db96d56Sopenharmony_ci                                    42)
2267db96d56Sopenharmony_ci            self.assertEqual(w[-1].message, message)
2277db96d56Sopenharmony_ci            del w[:]
2287db96d56Sopenharmony_ci            self.module.warn_explicit(message, UserWarning, "__init__.py",
2297db96d56Sopenharmony_ci                                    13)
2307db96d56Sopenharmony_ci            self.assertEqual(len(w), 0)
2317db96d56Sopenharmony_ci            self.module.warn_explicit(message, UserWarning, "test_warnings2.py",
2327db96d56Sopenharmony_ci                                    42)
2337db96d56Sopenharmony_ci            self.assertEqual(len(w), 0)
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci    def test_module_globals(self):
2367db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
2377db96d56Sopenharmony_ci                module=self.module) as w:
2387db96d56Sopenharmony_ci            self.module.simplefilter("always", UserWarning)
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci            # bpo-33509: module_globals=None must not crash
2417db96d56Sopenharmony_ci            self.module.warn_explicit('msg', UserWarning, "filename", 42,
2427db96d56Sopenharmony_ci                                      module_globals=None)
2437db96d56Sopenharmony_ci            self.assertEqual(len(w), 1)
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ci            # Invalid module_globals type
2467db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
2477db96d56Sopenharmony_ci                self.module.warn_explicit('msg', UserWarning, "filename", 42,
2487db96d56Sopenharmony_ci                                          module_globals=True)
2497db96d56Sopenharmony_ci            self.assertEqual(len(w), 1)
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci            # Empty module_globals
2527db96d56Sopenharmony_ci            self.module.warn_explicit('msg', UserWarning, "filename", 42,
2537db96d56Sopenharmony_ci                                      module_globals={})
2547db96d56Sopenharmony_ci            self.assertEqual(len(w), 2)
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci    def test_inheritance(self):
2577db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module) as w:
2587db96d56Sopenharmony_ci            self.module.resetwarnings()
2597db96d56Sopenharmony_ci            self.module.filterwarnings("error", category=Warning)
2607db96d56Sopenharmony_ci            self.assertRaises(UserWarning, self.module.warn,
2617db96d56Sopenharmony_ci                                "FilterTests.test_inheritance", UserWarning)
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci    def test_ordering(self):
2647db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
2657db96d56Sopenharmony_ci                module=self.module) as w:
2667db96d56Sopenharmony_ci            self.module.resetwarnings()
2677db96d56Sopenharmony_ci            self.module.filterwarnings("ignore", category=UserWarning)
2687db96d56Sopenharmony_ci            self.module.filterwarnings("error", category=UserWarning,
2697db96d56Sopenharmony_ci                                        append=True)
2707db96d56Sopenharmony_ci            del w[:]
2717db96d56Sopenharmony_ci            try:
2727db96d56Sopenharmony_ci                self.module.warn("FilterTests.test_ordering", UserWarning)
2737db96d56Sopenharmony_ci            except UserWarning:
2747db96d56Sopenharmony_ci                self.fail("order handling for actions failed")
2757db96d56Sopenharmony_ci            self.assertEqual(len(w), 0)
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci    def test_filterwarnings(self):
2787db96d56Sopenharmony_ci        # Test filterwarnings().
2797db96d56Sopenharmony_ci        # Implicitly also tests resetwarnings().
2807db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
2817db96d56Sopenharmony_ci                module=self.module) as w:
2827db96d56Sopenharmony_ci            self.module.filterwarnings("error", "", Warning, "", 0)
2837db96d56Sopenharmony_ci            self.assertRaises(UserWarning, self.module.warn, 'convert to error')
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci            self.module.resetwarnings()
2867db96d56Sopenharmony_ci            text = 'handle normally'
2877db96d56Sopenharmony_ci            self.module.warn(text)
2887db96d56Sopenharmony_ci            self.assertEqual(str(w[-1].message), text)
2897db96d56Sopenharmony_ci            self.assertIs(w[-1].category, UserWarning)
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci            self.module.filterwarnings("ignore", "", Warning, "", 0)
2927db96d56Sopenharmony_ci            text = 'filtered out'
2937db96d56Sopenharmony_ci            self.module.warn(text)
2947db96d56Sopenharmony_ci            self.assertNotEqual(str(w[-1].message), text)
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci            self.module.resetwarnings()
2977db96d56Sopenharmony_ci            self.module.filterwarnings("error", "hex*", Warning, "", 0)
2987db96d56Sopenharmony_ci            self.assertRaises(UserWarning, self.module.warn, 'hex/oct')
2997db96d56Sopenharmony_ci            text = 'nonmatching text'
3007db96d56Sopenharmony_ci            self.module.warn(text)
3017db96d56Sopenharmony_ci            self.assertEqual(str(w[-1].message), text)
3027db96d56Sopenharmony_ci            self.assertIs(w[-1].category, UserWarning)
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci    def test_message_matching(self):
3057db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
3067db96d56Sopenharmony_ci                module=self.module) as w:
3077db96d56Sopenharmony_ci            self.module.simplefilter("ignore", UserWarning)
3087db96d56Sopenharmony_ci            self.module.filterwarnings("error", "match", UserWarning)
3097db96d56Sopenharmony_ci            self.assertRaises(UserWarning, self.module.warn, "match")
3107db96d56Sopenharmony_ci            self.assertRaises(UserWarning, self.module.warn, "match prefix")
3117db96d56Sopenharmony_ci            self.module.warn("suffix match")
3127db96d56Sopenharmony_ci            self.assertEqual(w, [])
3137db96d56Sopenharmony_ci            self.module.warn("something completely different")
3147db96d56Sopenharmony_ci            self.assertEqual(w, [])
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci    def test_mutate_filter_list(self):
3177db96d56Sopenharmony_ci        class X:
3187db96d56Sopenharmony_ci            def match(self, a):
3197db96d56Sopenharmony_ci                L[:] = []
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci        L = [("default",X(),UserWarning,X(),0) for i in range(2)]
3227db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
3237db96d56Sopenharmony_ci                module=self.module) as w:
3247db96d56Sopenharmony_ci            self.module.filters = L
3257db96d56Sopenharmony_ci            self.module.warn_explicit(UserWarning("b"), None, "f.py", 42)
3267db96d56Sopenharmony_ci            self.assertEqual(str(w[-1].message), "b")
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci    def test_filterwarnings_duplicate_filters(self):
3297db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
3307db96d56Sopenharmony_ci            self.module.resetwarnings()
3317db96d56Sopenharmony_ci            self.module.filterwarnings("error", category=UserWarning)
3327db96d56Sopenharmony_ci            self.assertEqual(len(self.module.filters), 1)
3337db96d56Sopenharmony_ci            self.module.filterwarnings("ignore", category=UserWarning)
3347db96d56Sopenharmony_ci            self.module.filterwarnings("error", category=UserWarning)
3357db96d56Sopenharmony_ci            self.assertEqual(
3367db96d56Sopenharmony_ci                len(self.module.filters), 2,
3377db96d56Sopenharmony_ci                "filterwarnings inserted duplicate filter"
3387db96d56Sopenharmony_ci            )
3397db96d56Sopenharmony_ci            self.assertEqual(
3407db96d56Sopenharmony_ci                self.module.filters[0][0], "error",
3417db96d56Sopenharmony_ci                "filterwarnings did not promote filter to "
3427db96d56Sopenharmony_ci                "the beginning of list"
3437db96d56Sopenharmony_ci            )
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci    def test_simplefilter_duplicate_filters(self):
3467db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
3477db96d56Sopenharmony_ci            self.module.resetwarnings()
3487db96d56Sopenharmony_ci            self.module.simplefilter("error", category=UserWarning)
3497db96d56Sopenharmony_ci            self.assertEqual(len(self.module.filters), 1)
3507db96d56Sopenharmony_ci            self.module.simplefilter("ignore", category=UserWarning)
3517db96d56Sopenharmony_ci            self.module.simplefilter("error", category=UserWarning)
3527db96d56Sopenharmony_ci            self.assertEqual(
3537db96d56Sopenharmony_ci                len(self.module.filters), 2,
3547db96d56Sopenharmony_ci                "simplefilter inserted duplicate filter"
3557db96d56Sopenharmony_ci            )
3567db96d56Sopenharmony_ci            self.assertEqual(
3577db96d56Sopenharmony_ci                self.module.filters[0][0], "error",
3587db96d56Sopenharmony_ci                "simplefilter did not promote filter to the beginning of list"
3597db96d56Sopenharmony_ci            )
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci    def test_append_duplicate(self):
3627db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module,
3637db96d56Sopenharmony_ci                record=True) as w:
3647db96d56Sopenharmony_ci            self.module.resetwarnings()
3657db96d56Sopenharmony_ci            self.module.simplefilter("ignore")
3667db96d56Sopenharmony_ci            self.module.simplefilter("error", append=True)
3677db96d56Sopenharmony_ci            self.module.simplefilter("ignore", append=True)
3687db96d56Sopenharmony_ci            self.module.warn("test_append_duplicate", category=UserWarning)
3697db96d56Sopenharmony_ci            self.assertEqual(len(self.module.filters), 2,
3707db96d56Sopenharmony_ci                "simplefilter inserted duplicate filter"
3717db96d56Sopenharmony_ci            )
3727db96d56Sopenharmony_ci            self.assertEqual(len(w), 0,
3737db96d56Sopenharmony_ci                "appended duplicate changed order of filters"
3747db96d56Sopenharmony_ci            )
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci    def test_catchwarnings_with_simplefilter_ignore(self):
3777db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
3787db96d56Sopenharmony_ci            self.module.resetwarnings()
3797db96d56Sopenharmony_ci            self.module.simplefilter("error")
3807db96d56Sopenharmony_ci            with self.module.catch_warnings(
3817db96d56Sopenharmony_ci                module=self.module, action="ignore"
3827db96d56Sopenharmony_ci            ):
3837db96d56Sopenharmony_ci                self.module.warn("This will be ignored")
3847db96d56Sopenharmony_ci
3857db96d56Sopenharmony_ci    def test_catchwarnings_with_simplefilter_error(self):
3867db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
3877db96d56Sopenharmony_ci            self.module.resetwarnings()
3887db96d56Sopenharmony_ci            with self.module.catch_warnings(
3897db96d56Sopenharmony_ci                module=self.module, action="error", category=FutureWarning
3907db96d56Sopenharmony_ci            ):
3917db96d56Sopenharmony_ci                self.module.warn("Other types of warnings are not errors")
3927db96d56Sopenharmony_ci                self.assertRaises(FutureWarning,
3937db96d56Sopenharmony_ci                                  self.module.warn, FutureWarning("msg"))
3947db96d56Sopenharmony_ci
3957db96d56Sopenharmony_ciclass CFilterTests(FilterTests, unittest.TestCase):
3967db96d56Sopenharmony_ci    module = c_warnings
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ciclass PyFilterTests(FilterTests, unittest.TestCase):
3997db96d56Sopenharmony_ci    module = py_warnings
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ciclass WarnTests(BaseTest):
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci    """Test warnings.warn() and warnings.warn_explicit()."""
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ci    def test_message(self):
4077db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
4087db96d56Sopenharmony_ci                module=self.module) as w:
4097db96d56Sopenharmony_ci            self.module.simplefilter("once")
4107db96d56Sopenharmony_ci            for i in range(4):
4117db96d56Sopenharmony_ci                text = 'multi %d' %i  # Different text on each call.
4127db96d56Sopenharmony_ci                self.module.warn(text)
4137db96d56Sopenharmony_ci                self.assertEqual(str(w[-1].message), text)
4147db96d56Sopenharmony_ci                self.assertIs(w[-1].category, UserWarning)
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci    # Issue 3639
4177db96d56Sopenharmony_ci    def test_warn_nonstandard_types(self):
4187db96d56Sopenharmony_ci        # warn() should handle non-standard types without issue.
4197db96d56Sopenharmony_ci        for ob in (Warning, None, 42):
4207db96d56Sopenharmony_ci            with original_warnings.catch_warnings(record=True,
4217db96d56Sopenharmony_ci                    module=self.module) as w:
4227db96d56Sopenharmony_ci                self.module.simplefilter("once")
4237db96d56Sopenharmony_ci                self.module.warn(ob)
4247db96d56Sopenharmony_ci                # Don't directly compare objects since
4257db96d56Sopenharmony_ci                # ``Warning() != Warning()``.
4267db96d56Sopenharmony_ci                self.assertEqual(str(w[-1].message), str(UserWarning(ob)))
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ci    def test_filename(self):
4297db96d56Sopenharmony_ci        with warnings_state(self.module):
4307db96d56Sopenharmony_ci            with original_warnings.catch_warnings(record=True,
4317db96d56Sopenharmony_ci                    module=self.module) as w:
4327db96d56Sopenharmony_ci                warning_tests.inner("spam1")
4337db96d56Sopenharmony_ci                self.assertEqual(os.path.basename(w[-1].filename),
4347db96d56Sopenharmony_ci                                    "stacklevel.py")
4357db96d56Sopenharmony_ci                warning_tests.outer("spam2")
4367db96d56Sopenharmony_ci                self.assertEqual(os.path.basename(w[-1].filename),
4377db96d56Sopenharmony_ci                                    "stacklevel.py")
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci    def test_stacklevel(self):
4407db96d56Sopenharmony_ci        # Test stacklevel argument
4417db96d56Sopenharmony_ci        # make sure all messages are different, so the warning won't be skipped
4427db96d56Sopenharmony_ci        with warnings_state(self.module):
4437db96d56Sopenharmony_ci            with original_warnings.catch_warnings(record=True,
4447db96d56Sopenharmony_ci                    module=self.module) as w:
4457db96d56Sopenharmony_ci                warning_tests.inner("spam3", stacklevel=1)
4467db96d56Sopenharmony_ci                self.assertEqual(os.path.basename(w[-1].filename),
4477db96d56Sopenharmony_ci                                    "stacklevel.py")
4487db96d56Sopenharmony_ci                warning_tests.outer("spam4", stacklevel=1)
4497db96d56Sopenharmony_ci                self.assertEqual(os.path.basename(w[-1].filename),
4507db96d56Sopenharmony_ci                                    "stacklevel.py")
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci                warning_tests.inner("spam5", stacklevel=2)
4537db96d56Sopenharmony_ci                self.assertEqual(os.path.basename(w[-1].filename),
4547db96d56Sopenharmony_ci                                    "__init__.py")
4557db96d56Sopenharmony_ci                warning_tests.outer("spam6", stacklevel=2)
4567db96d56Sopenharmony_ci                self.assertEqual(os.path.basename(w[-1].filename),
4577db96d56Sopenharmony_ci                                    "stacklevel.py")
4587db96d56Sopenharmony_ci                warning_tests.outer("spam6.5", stacklevel=3)
4597db96d56Sopenharmony_ci                self.assertEqual(os.path.basename(w[-1].filename),
4607db96d56Sopenharmony_ci                                    "__init__.py")
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci                warning_tests.inner("spam7", stacklevel=9999)
4637db96d56Sopenharmony_ci                self.assertEqual(os.path.basename(w[-1].filename),
4647db96d56Sopenharmony_ci                                    "sys")
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci    def test_stacklevel_import(self):
4677db96d56Sopenharmony_ci        # Issue #24305: With stacklevel=2, module-level warnings should work.
4687db96d56Sopenharmony_ci        import_helper.unload('test.test_warnings.data.import_warning')
4697db96d56Sopenharmony_ci        with warnings_state(self.module):
4707db96d56Sopenharmony_ci            with original_warnings.catch_warnings(record=True,
4717db96d56Sopenharmony_ci                    module=self.module) as w:
4727db96d56Sopenharmony_ci                self.module.simplefilter('always')
4737db96d56Sopenharmony_ci                import test.test_warnings.data.import_warning
4747db96d56Sopenharmony_ci                self.assertEqual(len(w), 1)
4757db96d56Sopenharmony_ci                self.assertEqual(w[0].filename, __file__)
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci    def test_exec_filename(self):
4787db96d56Sopenharmony_ci        filename = "<warnings-test>"
4797db96d56Sopenharmony_ci        codeobj = compile(("import warnings\n"
4807db96d56Sopenharmony_ci                           "warnings.warn('hello', UserWarning)"),
4817db96d56Sopenharmony_ci                          filename, "exec")
4827db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True) as w:
4837db96d56Sopenharmony_ci            self.module.simplefilter("always", category=UserWarning)
4847db96d56Sopenharmony_ci            exec(codeobj)
4857db96d56Sopenharmony_ci        self.assertEqual(w[0].filename, filename)
4867db96d56Sopenharmony_ci
4877db96d56Sopenharmony_ci    def test_warn_explicit_non_ascii_filename(self):
4887db96d56Sopenharmony_ci        with original_warnings.catch_warnings(record=True,
4897db96d56Sopenharmony_ci                module=self.module) as w:
4907db96d56Sopenharmony_ci            self.module.resetwarnings()
4917db96d56Sopenharmony_ci            self.module.filterwarnings("always", category=UserWarning)
4927db96d56Sopenharmony_ci            filenames = ["nonascii\xe9\u20ac"]
4937db96d56Sopenharmony_ci            if not support.is_emscripten:
4947db96d56Sopenharmony_ci                # JavaScript does not like surrogates.
4957db96d56Sopenharmony_ci                # Invalid UTF-8 leading byte 0x80 encountered when
4967db96d56Sopenharmony_ci                # deserializing a UTF-8 string in wasm memory to a JS
4977db96d56Sopenharmony_ci                # string!
4987db96d56Sopenharmony_ci                filenames.append("surrogate\udc80")
4997db96d56Sopenharmony_ci            for filename in filenames:
5007db96d56Sopenharmony_ci                try:
5017db96d56Sopenharmony_ci                    os.fsencode(filename)
5027db96d56Sopenharmony_ci                except UnicodeEncodeError:
5037db96d56Sopenharmony_ci                    continue
5047db96d56Sopenharmony_ci                self.module.warn_explicit("text", UserWarning, filename, 1)
5057db96d56Sopenharmony_ci                self.assertEqual(w[-1].filename, filename)
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci    def test_warn_explicit_type_errors(self):
5087db96d56Sopenharmony_ci        # warn_explicit() should error out gracefully if it is given objects
5097db96d56Sopenharmony_ci        # of the wrong types.
5107db96d56Sopenharmony_ci        # lineno is expected to be an integer.
5117db96d56Sopenharmony_ci        self.assertRaises(TypeError, self.module.warn_explicit,
5127db96d56Sopenharmony_ci                            None, UserWarning, None, None)
5137db96d56Sopenharmony_ci        # Either 'message' needs to be an instance of Warning or 'category'
5147db96d56Sopenharmony_ci        # needs to be a subclass.
5157db96d56Sopenharmony_ci        self.assertRaises(TypeError, self.module.warn_explicit,
5167db96d56Sopenharmony_ci                            None, None, None, 1)
5177db96d56Sopenharmony_ci        # 'registry' must be a dict or None.
5187db96d56Sopenharmony_ci        self.assertRaises((TypeError, AttributeError),
5197db96d56Sopenharmony_ci                            self.module.warn_explicit,
5207db96d56Sopenharmony_ci                            None, Warning, None, 1, registry=42)
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci    def test_bad_str(self):
5237db96d56Sopenharmony_ci        # issue 6415
5247db96d56Sopenharmony_ci        # Warnings instance with a bad format string for __str__ should not
5257db96d56Sopenharmony_ci        # trigger a bus error.
5267db96d56Sopenharmony_ci        class BadStrWarning(Warning):
5277db96d56Sopenharmony_ci            """Warning with a bad format string for __str__."""
5287db96d56Sopenharmony_ci            def __str__(self):
5297db96d56Sopenharmony_ci                return ("A bad formatted string %(err)" %
5307db96d56Sopenharmony_ci                        {"err" : "there is no %(err)s"})
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
5337db96d56Sopenharmony_ci            self.module.warn(BadStrWarning())
5347db96d56Sopenharmony_ci
5357db96d56Sopenharmony_ci    def test_warning_classes(self):
5367db96d56Sopenharmony_ci        class MyWarningClass(Warning):
5377db96d56Sopenharmony_ci            pass
5387db96d56Sopenharmony_ci
5397db96d56Sopenharmony_ci        class NonWarningSubclass:
5407db96d56Sopenharmony_ci            pass
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci        # passing a non-subclass of Warning should raise a TypeError
5437db96d56Sopenharmony_ci        with self.assertRaises(TypeError) as cm:
5447db96d56Sopenharmony_ci            self.module.warn('bad warning category', '')
5457db96d56Sopenharmony_ci        self.assertIn('category must be a Warning subclass, not ',
5467db96d56Sopenharmony_ci                      str(cm.exception))
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_ci        with self.assertRaises(TypeError) as cm:
5497db96d56Sopenharmony_ci            self.module.warn('bad warning category', NonWarningSubclass)
5507db96d56Sopenharmony_ci        self.assertIn('category must be a Warning subclass, not ',
5517db96d56Sopenharmony_ci                      str(cm.exception))
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_ci        # check that warning instances also raise a TypeError
5547db96d56Sopenharmony_ci        with self.assertRaises(TypeError) as cm:
5557db96d56Sopenharmony_ci            self.module.warn('bad warning category', MyWarningClass())
5567db96d56Sopenharmony_ci        self.assertIn('category must be a Warning subclass, not ',
5577db96d56Sopenharmony_ci                      str(cm.exception))
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
5607db96d56Sopenharmony_ci            self.module.resetwarnings()
5617db96d56Sopenharmony_ci            self.module.filterwarnings('default')
5627db96d56Sopenharmony_ci            with self.assertWarns(MyWarningClass) as cm:
5637db96d56Sopenharmony_ci                self.module.warn('good warning category', MyWarningClass)
5647db96d56Sopenharmony_ci            self.assertEqual('good warning category', str(cm.warning))
5657db96d56Sopenharmony_ci
5667db96d56Sopenharmony_ci            with self.assertWarns(UserWarning) as cm:
5677db96d56Sopenharmony_ci                self.module.warn('good warning category', None)
5687db96d56Sopenharmony_ci            self.assertEqual('good warning category', str(cm.warning))
5697db96d56Sopenharmony_ci
5707db96d56Sopenharmony_ci            with self.assertWarns(MyWarningClass) as cm:
5717db96d56Sopenharmony_ci                self.module.warn('good warning category', MyWarningClass)
5727db96d56Sopenharmony_ci            self.assertIsInstance(cm.warning, Warning)
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ciclass CWarnTests(WarnTests, unittest.TestCase):
5757db96d56Sopenharmony_ci    module = c_warnings
5767db96d56Sopenharmony_ci
5777db96d56Sopenharmony_ci    # As an early adopter, we sanity check the
5787db96d56Sopenharmony_ci    # test.import_helper.import_fresh_module utility function
5797db96d56Sopenharmony_ci    def test_accelerated(self):
5807db96d56Sopenharmony_ci        self.assertIsNot(original_warnings, self.module)
5817db96d56Sopenharmony_ci        self.assertFalse(hasattr(self.module.warn, '__code__'))
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ciclass PyWarnTests(WarnTests, unittest.TestCase):
5847db96d56Sopenharmony_ci    module = py_warnings
5857db96d56Sopenharmony_ci
5867db96d56Sopenharmony_ci    # As an early adopter, we sanity check the
5877db96d56Sopenharmony_ci    # test.import_helper.import_fresh_module utility function
5887db96d56Sopenharmony_ci    def test_pure_python(self):
5897db96d56Sopenharmony_ci        self.assertIsNot(original_warnings, self.module)
5907db96d56Sopenharmony_ci        self.assertTrue(hasattr(self.module.warn, '__code__'))
5917db96d56Sopenharmony_ci
5927db96d56Sopenharmony_ci
5937db96d56Sopenharmony_ciclass WCmdLineTests(BaseTest):
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci    def test_improper_input(self):
5967db96d56Sopenharmony_ci        # Uses the private _setoption() function to test the parsing
5977db96d56Sopenharmony_ci        # of command-line warning arguments
5987db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
5997db96d56Sopenharmony_ci            self.assertRaises(self.module._OptionError,
6007db96d56Sopenharmony_ci                              self.module._setoption, '1:2:3:4:5:6')
6017db96d56Sopenharmony_ci            self.assertRaises(self.module._OptionError,
6027db96d56Sopenharmony_ci                              self.module._setoption, 'bogus::Warning')
6037db96d56Sopenharmony_ci            self.assertRaises(self.module._OptionError,
6047db96d56Sopenharmony_ci                              self.module._setoption, 'ignore:2::4:-5')
6057db96d56Sopenharmony_ci            with self.assertRaises(self.module._OptionError):
6067db96d56Sopenharmony_ci                self.module._setoption('ignore::123')
6077db96d56Sopenharmony_ci            with self.assertRaises(self.module._OptionError):
6087db96d56Sopenharmony_ci                self.module._setoption('ignore::123abc')
6097db96d56Sopenharmony_ci            with self.assertRaises(self.module._OptionError):
6107db96d56Sopenharmony_ci                self.module._setoption('ignore::===')
6117db96d56Sopenharmony_ci            with self.assertRaisesRegex(self.module._OptionError, 'Wärning'):
6127db96d56Sopenharmony_ci                self.module._setoption('ignore::Wärning')
6137db96d56Sopenharmony_ci            self.module._setoption('error::Warning::0')
6147db96d56Sopenharmony_ci            self.assertRaises(UserWarning, self.module.warn, 'convert to error')
6157db96d56Sopenharmony_ci
6167db96d56Sopenharmony_ci    def test_import_from_module(self):
6177db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
6187db96d56Sopenharmony_ci            self.module._setoption('ignore::Warning')
6197db96d56Sopenharmony_ci            with self.assertRaises(self.module._OptionError):
6207db96d56Sopenharmony_ci                self.module._setoption('ignore::TestWarning')
6217db96d56Sopenharmony_ci            with self.assertRaises(self.module._OptionError):
6227db96d56Sopenharmony_ci                self.module._setoption('ignore::test.test_warnings.bogus')
6237db96d56Sopenharmony_ci            self.module._setoption('error::test.test_warnings.TestWarning')
6247db96d56Sopenharmony_ci            with self.assertRaises(TestWarning):
6257db96d56Sopenharmony_ci                self.module.warn('test warning', TestWarning)
6267db96d56Sopenharmony_ci
6277db96d56Sopenharmony_ci
6287db96d56Sopenharmony_ciclass CWCmdLineTests(WCmdLineTests, unittest.TestCase):
6297db96d56Sopenharmony_ci    module = c_warnings
6307db96d56Sopenharmony_ci
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ciclass PyWCmdLineTests(WCmdLineTests, unittest.TestCase):
6337db96d56Sopenharmony_ci    module = py_warnings
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci    def test_improper_option(self):
6367db96d56Sopenharmony_ci        # Same as above, but check that the message is printed out when
6377db96d56Sopenharmony_ci        # the interpreter is executed. This also checks that options are
6387db96d56Sopenharmony_ci        # actually parsed at all.
6397db96d56Sopenharmony_ci        rc, out, err = assert_python_ok("-Wxxx", "-c", "pass")
6407db96d56Sopenharmony_ci        self.assertIn(b"Invalid -W option ignored: invalid action: 'xxx'", err)
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci    def test_warnings_bootstrap(self):
6437db96d56Sopenharmony_ci        # Check that the warnings module does get loaded when -W<some option>
6447db96d56Sopenharmony_ci        # is used (see issue #10372 for an example of silent bootstrap failure).
6457db96d56Sopenharmony_ci        rc, out, err = assert_python_ok("-Wi", "-c",
6467db96d56Sopenharmony_ci            "import sys; sys.modules['warnings'].warn('foo', RuntimeWarning)")
6477db96d56Sopenharmony_ci        # '-Wi' was observed
6487db96d56Sopenharmony_ci        self.assertFalse(out.strip())
6497db96d56Sopenharmony_ci        self.assertNotIn(b'RuntimeWarning', err)
6507db96d56Sopenharmony_ci
6517db96d56Sopenharmony_ci
6527db96d56Sopenharmony_ciclass _WarningsTests(BaseTest, unittest.TestCase):
6537db96d56Sopenharmony_ci
6547db96d56Sopenharmony_ci    """Tests specific to the _warnings module."""
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci    module = c_warnings
6577db96d56Sopenharmony_ci
6587db96d56Sopenharmony_ci    def test_filter(self):
6597db96d56Sopenharmony_ci        # Everything should function even if 'filters' is not in warnings.
6607db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module) as w:
6617db96d56Sopenharmony_ci            self.module.filterwarnings("error", "", Warning, "", 0)
6627db96d56Sopenharmony_ci            self.assertRaises(UserWarning, self.module.warn,
6637db96d56Sopenharmony_ci                                'convert to error')
6647db96d56Sopenharmony_ci            del self.module.filters
6657db96d56Sopenharmony_ci            self.assertRaises(UserWarning, self.module.warn,
6667db96d56Sopenharmony_ci                                'convert to error')
6677db96d56Sopenharmony_ci
6687db96d56Sopenharmony_ci    def test_onceregistry(self):
6697db96d56Sopenharmony_ci        # Replacing or removing the onceregistry should be okay.
6707db96d56Sopenharmony_ci        global __warningregistry__
6717db96d56Sopenharmony_ci        message = UserWarning('onceregistry test')
6727db96d56Sopenharmony_ci        try:
6737db96d56Sopenharmony_ci            original_registry = self.module.onceregistry
6747db96d56Sopenharmony_ci            __warningregistry__ = {}
6757db96d56Sopenharmony_ci            with original_warnings.catch_warnings(record=True,
6767db96d56Sopenharmony_ci                    module=self.module) as w:
6777db96d56Sopenharmony_ci                self.module.resetwarnings()
6787db96d56Sopenharmony_ci                self.module.filterwarnings("once", category=UserWarning)
6797db96d56Sopenharmony_ci                self.module.warn_explicit(message, UserWarning, "file", 42)
6807db96d56Sopenharmony_ci                self.assertEqual(w[-1].message, message)
6817db96d56Sopenharmony_ci                del w[:]
6827db96d56Sopenharmony_ci                self.module.warn_explicit(message, UserWarning, "file", 42)
6837db96d56Sopenharmony_ci                self.assertEqual(len(w), 0)
6847db96d56Sopenharmony_ci                # Test the resetting of onceregistry.
6857db96d56Sopenharmony_ci                self.module.onceregistry = {}
6867db96d56Sopenharmony_ci                __warningregistry__ = {}
6877db96d56Sopenharmony_ci                self.module.warn('onceregistry test')
6887db96d56Sopenharmony_ci                self.assertEqual(w[-1].message.args, message.args)
6897db96d56Sopenharmony_ci                # Removal of onceregistry is okay.
6907db96d56Sopenharmony_ci                del w[:]
6917db96d56Sopenharmony_ci                del self.module.onceregistry
6927db96d56Sopenharmony_ci                __warningregistry__ = {}
6937db96d56Sopenharmony_ci                self.module.warn_explicit(message, UserWarning, "file", 42)
6947db96d56Sopenharmony_ci                self.assertEqual(len(w), 0)
6957db96d56Sopenharmony_ci        finally:
6967db96d56Sopenharmony_ci            self.module.onceregistry = original_registry
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ci    def test_default_action(self):
6997db96d56Sopenharmony_ci        # Replacing or removing defaultaction should be okay.
7007db96d56Sopenharmony_ci        message = UserWarning("defaultaction test")
7017db96d56Sopenharmony_ci        original = self.module.defaultaction
7027db96d56Sopenharmony_ci        try:
7037db96d56Sopenharmony_ci            with original_warnings.catch_warnings(record=True,
7047db96d56Sopenharmony_ci                    module=self.module) as w:
7057db96d56Sopenharmony_ci                self.module.resetwarnings()
7067db96d56Sopenharmony_ci                registry = {}
7077db96d56Sopenharmony_ci                self.module.warn_explicit(message, UserWarning, "<test>", 42,
7087db96d56Sopenharmony_ci                                            registry=registry)
7097db96d56Sopenharmony_ci                self.assertEqual(w[-1].message, message)
7107db96d56Sopenharmony_ci                self.assertEqual(len(w), 1)
7117db96d56Sopenharmony_ci                # One actual registry key plus the "version" key
7127db96d56Sopenharmony_ci                self.assertEqual(len(registry), 2)
7137db96d56Sopenharmony_ci                self.assertIn("version", registry)
7147db96d56Sopenharmony_ci                del w[:]
7157db96d56Sopenharmony_ci                # Test removal.
7167db96d56Sopenharmony_ci                del self.module.defaultaction
7177db96d56Sopenharmony_ci                __warningregistry__ = {}
7187db96d56Sopenharmony_ci                registry = {}
7197db96d56Sopenharmony_ci                self.module.warn_explicit(message, UserWarning, "<test>", 43,
7207db96d56Sopenharmony_ci                                            registry=registry)
7217db96d56Sopenharmony_ci                self.assertEqual(w[-1].message, message)
7227db96d56Sopenharmony_ci                self.assertEqual(len(w), 1)
7237db96d56Sopenharmony_ci                self.assertEqual(len(registry), 2)
7247db96d56Sopenharmony_ci                del w[:]
7257db96d56Sopenharmony_ci                # Test setting.
7267db96d56Sopenharmony_ci                self.module.defaultaction = "ignore"
7277db96d56Sopenharmony_ci                __warningregistry__ = {}
7287db96d56Sopenharmony_ci                registry = {}
7297db96d56Sopenharmony_ci                self.module.warn_explicit(message, UserWarning, "<test>", 44,
7307db96d56Sopenharmony_ci                                            registry=registry)
7317db96d56Sopenharmony_ci                self.assertEqual(len(w), 0)
7327db96d56Sopenharmony_ci        finally:
7337db96d56Sopenharmony_ci            self.module.defaultaction = original
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci    def test_showwarning_missing(self):
7367db96d56Sopenharmony_ci        # Test that showwarning() missing is okay.
7377db96d56Sopenharmony_ci        text = 'del showwarning test'
7387db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
7397db96d56Sopenharmony_ci            self.module.filterwarnings("always", category=UserWarning)
7407db96d56Sopenharmony_ci            del self.module.showwarning
7417db96d56Sopenharmony_ci            with support.captured_output('stderr') as stream:
7427db96d56Sopenharmony_ci                self.module.warn(text)
7437db96d56Sopenharmony_ci                result = stream.getvalue()
7447db96d56Sopenharmony_ci        self.assertIn(text, result)
7457db96d56Sopenharmony_ci
7467db96d56Sopenharmony_ci    def test_showwarnmsg_missing(self):
7477db96d56Sopenharmony_ci        # Test that _showwarnmsg() missing is okay.
7487db96d56Sopenharmony_ci        text = 'del _showwarnmsg test'
7497db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
7507db96d56Sopenharmony_ci            self.module.filterwarnings("always", category=UserWarning)
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci            show = self.module._showwarnmsg
7537db96d56Sopenharmony_ci            try:
7547db96d56Sopenharmony_ci                del self.module._showwarnmsg
7557db96d56Sopenharmony_ci                with support.captured_output('stderr') as stream:
7567db96d56Sopenharmony_ci                    self.module.warn(text)
7577db96d56Sopenharmony_ci                    result = stream.getvalue()
7587db96d56Sopenharmony_ci            finally:
7597db96d56Sopenharmony_ci                self.module._showwarnmsg = show
7607db96d56Sopenharmony_ci        self.assertIn(text, result)
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ci    def test_showwarning_not_callable(self):
7637db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
7647db96d56Sopenharmony_ci            self.module.filterwarnings("always", category=UserWarning)
7657db96d56Sopenharmony_ci            self.module.showwarning = print
7667db96d56Sopenharmony_ci            with support.captured_output('stdout'):
7677db96d56Sopenharmony_ci                self.module.warn('Warning!')
7687db96d56Sopenharmony_ci            self.module.showwarning = 23
7697db96d56Sopenharmony_ci            self.assertRaises(TypeError, self.module.warn, "Warning!")
7707db96d56Sopenharmony_ci
7717db96d56Sopenharmony_ci    def test_show_warning_output(self):
7727db96d56Sopenharmony_ci        # With showwarning() missing, make sure that output is okay.
7737db96d56Sopenharmony_ci        text = 'test show_warning'
7747db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
7757db96d56Sopenharmony_ci            self.module.filterwarnings("always", category=UserWarning)
7767db96d56Sopenharmony_ci            del self.module.showwarning
7777db96d56Sopenharmony_ci            with support.captured_output('stderr') as stream:
7787db96d56Sopenharmony_ci                warning_tests.inner(text)
7797db96d56Sopenharmony_ci                result = stream.getvalue()
7807db96d56Sopenharmony_ci        self.assertEqual(result.count('\n'), 2,
7817db96d56Sopenharmony_ci                             "Too many newlines in %r" % result)
7827db96d56Sopenharmony_ci        first_line, second_line = result.split('\n', 1)
7837db96d56Sopenharmony_ci        expected_file = os.path.splitext(warning_tests.__file__)[0] + '.py'
7847db96d56Sopenharmony_ci        first_line_parts = first_line.rsplit(':', 3)
7857db96d56Sopenharmony_ci        path, line, warning_class, message = first_line_parts
7867db96d56Sopenharmony_ci        line = int(line)
7877db96d56Sopenharmony_ci        self.assertEqual(expected_file, path)
7887db96d56Sopenharmony_ci        self.assertEqual(warning_class, ' ' + UserWarning.__name__)
7897db96d56Sopenharmony_ci        self.assertEqual(message, ' ' + text)
7907db96d56Sopenharmony_ci        expected_line = '  ' + linecache.getline(path, line).strip() + '\n'
7917db96d56Sopenharmony_ci        assert expected_line
7927db96d56Sopenharmony_ci        self.assertEqual(second_line, expected_line)
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci    def test_filename_none(self):
7957db96d56Sopenharmony_ci        # issue #12467: race condition if a warning is emitted at shutdown
7967db96d56Sopenharmony_ci        globals_dict = globals()
7977db96d56Sopenharmony_ci        oldfile = globals_dict['__file__']
7987db96d56Sopenharmony_ci        try:
7997db96d56Sopenharmony_ci            catch = original_warnings.catch_warnings(record=True,
8007db96d56Sopenharmony_ci                                                     module=self.module)
8017db96d56Sopenharmony_ci            with catch as w:
8027db96d56Sopenharmony_ci                self.module.filterwarnings("always", category=UserWarning)
8037db96d56Sopenharmony_ci                globals_dict['__file__'] = None
8047db96d56Sopenharmony_ci                original_warnings.warn('test', UserWarning)
8057db96d56Sopenharmony_ci                self.assertTrue(len(w))
8067db96d56Sopenharmony_ci        finally:
8077db96d56Sopenharmony_ci            globals_dict['__file__'] = oldfile
8087db96d56Sopenharmony_ci
8097db96d56Sopenharmony_ci    def test_stderr_none(self):
8107db96d56Sopenharmony_ci        rc, stdout, stderr = assert_python_ok("-c",
8117db96d56Sopenharmony_ci            "import sys; sys.stderr = None; "
8127db96d56Sopenharmony_ci            "import warnings; warnings.simplefilter('always'); "
8137db96d56Sopenharmony_ci            "warnings.warn('Warning!')")
8147db96d56Sopenharmony_ci        self.assertEqual(stdout, b'')
8157db96d56Sopenharmony_ci        self.assertNotIn(b'Warning!', stderr)
8167db96d56Sopenharmony_ci        self.assertNotIn(b'Error', stderr)
8177db96d56Sopenharmony_ci
8187db96d56Sopenharmony_ci    def test_issue31285(self):
8197db96d56Sopenharmony_ci        # warn_explicit() should neither raise a SystemError nor cause an
8207db96d56Sopenharmony_ci        # assertion failure, in case the return value of get_source() has a
8217db96d56Sopenharmony_ci        # bad splitlines() method.
8227db96d56Sopenharmony_ci        def get_bad_loader(splitlines_ret_val):
8237db96d56Sopenharmony_ci            class BadLoader:
8247db96d56Sopenharmony_ci                def get_source(self, fullname):
8257db96d56Sopenharmony_ci                    class BadSource(str):
8267db96d56Sopenharmony_ci                        def splitlines(self):
8277db96d56Sopenharmony_ci                            return splitlines_ret_val
8287db96d56Sopenharmony_ci                    return BadSource('spam')
8297db96d56Sopenharmony_ci            return BadLoader()
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci        wmod = self.module
8327db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=wmod):
8337db96d56Sopenharmony_ci            wmod.filterwarnings('default', category=UserWarning)
8347db96d56Sopenharmony_ci
8357db96d56Sopenharmony_ci            with support.captured_stderr() as stderr:
8367db96d56Sopenharmony_ci                wmod.warn_explicit(
8377db96d56Sopenharmony_ci                    'foo', UserWarning, 'bar', 1,
8387db96d56Sopenharmony_ci                    module_globals={'__loader__': get_bad_loader(42),
8397db96d56Sopenharmony_ci                                    '__name__': 'foobar'})
8407db96d56Sopenharmony_ci            self.assertIn('UserWarning: foo', stderr.getvalue())
8417db96d56Sopenharmony_ci
8427db96d56Sopenharmony_ci            show = wmod._showwarnmsg
8437db96d56Sopenharmony_ci            try:
8447db96d56Sopenharmony_ci                del wmod._showwarnmsg
8457db96d56Sopenharmony_ci                with support.captured_stderr() as stderr:
8467db96d56Sopenharmony_ci                    wmod.warn_explicit(
8477db96d56Sopenharmony_ci                        'eggs', UserWarning, 'bar', 1,
8487db96d56Sopenharmony_ci                        module_globals={'__loader__': get_bad_loader([42]),
8497db96d56Sopenharmony_ci                                        '__name__': 'foobar'})
8507db96d56Sopenharmony_ci                self.assertIn('UserWarning: eggs', stderr.getvalue())
8517db96d56Sopenharmony_ci            finally:
8527db96d56Sopenharmony_ci                wmod._showwarnmsg = show
8537db96d56Sopenharmony_ci
8547db96d56Sopenharmony_ci    @support.cpython_only
8557db96d56Sopenharmony_ci    def test_issue31411(self):
8567db96d56Sopenharmony_ci        # warn_explicit() shouldn't raise a SystemError in case
8577db96d56Sopenharmony_ci        # warnings.onceregistry isn't a dictionary.
8587db96d56Sopenharmony_ci        wmod = self.module
8597db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=wmod):
8607db96d56Sopenharmony_ci            wmod.filterwarnings('once')
8617db96d56Sopenharmony_ci            with support.swap_attr(wmod, 'onceregistry', None):
8627db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
8637db96d56Sopenharmony_ci                    wmod.warn_explicit('foo', Warning, 'bar', 1, registry=None)
8647db96d56Sopenharmony_ci
8657db96d56Sopenharmony_ci    @support.cpython_only
8667db96d56Sopenharmony_ci    def test_issue31416(self):
8677db96d56Sopenharmony_ci        # warn_explicit() shouldn't cause an assertion failure in case of a
8687db96d56Sopenharmony_ci        # bad warnings.filters or warnings.defaultaction.
8697db96d56Sopenharmony_ci        wmod = self.module
8707db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=wmod):
8717db96d56Sopenharmony_ci            wmod.filters = [(None, None, Warning, None, 0)]
8727db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
8737db96d56Sopenharmony_ci                wmod.warn_explicit('foo', Warning, 'bar', 1)
8747db96d56Sopenharmony_ci
8757db96d56Sopenharmony_ci            wmod.filters = []
8767db96d56Sopenharmony_ci            with support.swap_attr(wmod, 'defaultaction', None), \
8777db96d56Sopenharmony_ci                 self.assertRaises(TypeError):
8787db96d56Sopenharmony_ci                wmod.warn_explicit('foo', Warning, 'bar', 1)
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci    @support.cpython_only
8817db96d56Sopenharmony_ci    def test_issue31566(self):
8827db96d56Sopenharmony_ci        # warn() shouldn't cause an assertion failure in case of a bad
8837db96d56Sopenharmony_ci        # __name__ global.
8847db96d56Sopenharmony_ci        with original_warnings.catch_warnings(module=self.module):
8857db96d56Sopenharmony_ci            self.module.filterwarnings('error', category=UserWarning)
8867db96d56Sopenharmony_ci            with support.swap_item(globals(), '__name__', b'foo'), \
8877db96d56Sopenharmony_ci                 support.swap_item(globals(), '__file__', None):
8887db96d56Sopenharmony_ci                self.assertRaises(UserWarning, self.module.warn, 'bar')
8897db96d56Sopenharmony_ci
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ciclass WarningsDisplayTests(BaseTest):
8927db96d56Sopenharmony_ci
8937db96d56Sopenharmony_ci    """Test the displaying of warnings and the ability to overload functions
8947db96d56Sopenharmony_ci    related to displaying warnings."""
8957db96d56Sopenharmony_ci
8967db96d56Sopenharmony_ci    def test_formatwarning(self):
8977db96d56Sopenharmony_ci        message = "msg"
8987db96d56Sopenharmony_ci        category = Warning
8997db96d56Sopenharmony_ci        file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
9007db96d56Sopenharmony_ci        line_num = 3
9017db96d56Sopenharmony_ci        file_line = linecache.getline(file_name, line_num).strip()
9027db96d56Sopenharmony_ci        format = "%s:%s: %s: %s\n  %s\n"
9037db96d56Sopenharmony_ci        expect = format % (file_name, line_num, category.__name__, message,
9047db96d56Sopenharmony_ci                            file_line)
9057db96d56Sopenharmony_ci        self.assertEqual(expect, self.module.formatwarning(message,
9067db96d56Sopenharmony_ci                                                category, file_name, line_num))
9077db96d56Sopenharmony_ci        # Test the 'line' argument.
9087db96d56Sopenharmony_ci        file_line += " for the win!"
9097db96d56Sopenharmony_ci        expect = format % (file_name, line_num, category.__name__, message,
9107db96d56Sopenharmony_ci                            file_line)
9117db96d56Sopenharmony_ci        self.assertEqual(expect, self.module.formatwarning(message,
9127db96d56Sopenharmony_ci                                    category, file_name, line_num, file_line))
9137db96d56Sopenharmony_ci
9147db96d56Sopenharmony_ci    def test_showwarning(self):
9157db96d56Sopenharmony_ci        file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
9167db96d56Sopenharmony_ci        line_num = 3
9177db96d56Sopenharmony_ci        expected_file_line = linecache.getline(file_name, line_num).strip()
9187db96d56Sopenharmony_ci        message = 'msg'
9197db96d56Sopenharmony_ci        category = Warning
9207db96d56Sopenharmony_ci        file_object = StringIO()
9217db96d56Sopenharmony_ci        expect = self.module.formatwarning(message, category, file_name,
9227db96d56Sopenharmony_ci                                            line_num)
9237db96d56Sopenharmony_ci        self.module.showwarning(message, category, file_name, line_num,
9247db96d56Sopenharmony_ci                                file_object)
9257db96d56Sopenharmony_ci        self.assertEqual(file_object.getvalue(), expect)
9267db96d56Sopenharmony_ci        # Test 'line' argument.
9277db96d56Sopenharmony_ci        expected_file_line += "for the win!"
9287db96d56Sopenharmony_ci        expect = self.module.formatwarning(message, category, file_name,
9297db96d56Sopenharmony_ci                                            line_num, expected_file_line)
9307db96d56Sopenharmony_ci        file_object = StringIO()
9317db96d56Sopenharmony_ci        self.module.showwarning(message, category, file_name, line_num,
9327db96d56Sopenharmony_ci                                file_object, expected_file_line)
9337db96d56Sopenharmony_ci        self.assertEqual(expect, file_object.getvalue())
9347db96d56Sopenharmony_ci
9357db96d56Sopenharmony_ci    def test_formatwarning_override(self):
9367db96d56Sopenharmony_ci        # bpo-35178: Test that a custom formatwarning function gets the 'line'
9377db96d56Sopenharmony_ci        # argument as a positional argument, and not only as a keyword argument
9387db96d56Sopenharmony_ci        def myformatwarning(message, category, filename, lineno, text):
9397db96d56Sopenharmony_ci            return f'm={message}:c={category}:f={filename}:l={lineno}:t={text}'
9407db96d56Sopenharmony_ci
9417db96d56Sopenharmony_ci        file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
9427db96d56Sopenharmony_ci        line_num = 3
9437db96d56Sopenharmony_ci        file_line = linecache.getline(file_name, line_num).strip()
9447db96d56Sopenharmony_ci        message = 'msg'
9457db96d56Sopenharmony_ci        category = Warning
9467db96d56Sopenharmony_ci        file_object = StringIO()
9477db96d56Sopenharmony_ci        expected = f'm={message}:c={category}:f={file_name}:l={line_num}' + \
9487db96d56Sopenharmony_ci                   f':t={file_line}'
9497db96d56Sopenharmony_ci        with support.swap_attr(self.module, 'formatwarning', myformatwarning):
9507db96d56Sopenharmony_ci            self.module.showwarning(message, category, file_name, line_num,
9517db96d56Sopenharmony_ci                                    file_object, file_line)
9527db96d56Sopenharmony_ci            self.assertEqual(file_object.getvalue(), expected)
9537db96d56Sopenharmony_ci
9547db96d56Sopenharmony_ci
9557db96d56Sopenharmony_ciclass CWarningsDisplayTests(WarningsDisplayTests, unittest.TestCase):
9567db96d56Sopenharmony_ci    module = c_warnings
9577db96d56Sopenharmony_ci
9587db96d56Sopenharmony_ciclass PyWarningsDisplayTests(WarningsDisplayTests, unittest.TestCase):
9597db96d56Sopenharmony_ci    module = py_warnings
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci    def test_tracemalloc(self):
9627db96d56Sopenharmony_ci        self.addCleanup(os_helper.unlink, os_helper.TESTFN)
9637db96d56Sopenharmony_ci
9647db96d56Sopenharmony_ci        with open(os_helper.TESTFN, 'w', encoding="utf-8") as fp:
9657db96d56Sopenharmony_ci            fp.write(textwrap.dedent("""
9667db96d56Sopenharmony_ci                def func():
9677db96d56Sopenharmony_ci                    f = open(__file__, "rb")
9687db96d56Sopenharmony_ci                    # Emit ResourceWarning
9697db96d56Sopenharmony_ci                    f = None
9707db96d56Sopenharmony_ci
9717db96d56Sopenharmony_ci                func()
9727db96d56Sopenharmony_ci            """))
9737db96d56Sopenharmony_ci
9747db96d56Sopenharmony_ci        def run(*args):
9757db96d56Sopenharmony_ci            res = assert_python_ok(*args, PYTHONIOENCODING='utf-8')
9767db96d56Sopenharmony_ci            stderr = res.err.decode('utf-8', 'replace')
9777db96d56Sopenharmony_ci            stderr = '\n'.join(stderr.splitlines())
9787db96d56Sopenharmony_ci
9797db96d56Sopenharmony_ci            # normalize newlines
9807db96d56Sopenharmony_ci            stderr = re.sub('<.*>', '<...>', stderr)
9817db96d56Sopenharmony_ci            return stderr
9827db96d56Sopenharmony_ci
9837db96d56Sopenharmony_ci        # tracemalloc disabled
9847db96d56Sopenharmony_ci        filename = os.path.abspath(os_helper.TESTFN)
9857db96d56Sopenharmony_ci        stderr = run('-Wd', os_helper.TESTFN)
9867db96d56Sopenharmony_ci        expected = textwrap.dedent(f'''
9877db96d56Sopenharmony_ci            {filename}:5: ResourceWarning: unclosed file <...>
9887db96d56Sopenharmony_ci              f = None
9897db96d56Sopenharmony_ci            ResourceWarning: Enable tracemalloc to get the object allocation traceback
9907db96d56Sopenharmony_ci        ''').strip()
9917db96d56Sopenharmony_ci        self.assertEqual(stderr, expected)
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci        # tracemalloc enabled
9947db96d56Sopenharmony_ci        stderr = run('-Wd', '-X', 'tracemalloc=2', os_helper.TESTFN)
9957db96d56Sopenharmony_ci        expected = textwrap.dedent(f'''
9967db96d56Sopenharmony_ci            {filename}:5: ResourceWarning: unclosed file <...>
9977db96d56Sopenharmony_ci              f = None
9987db96d56Sopenharmony_ci            Object allocated at (most recent call last):
9997db96d56Sopenharmony_ci              File "{filename}", lineno 7
10007db96d56Sopenharmony_ci                func()
10017db96d56Sopenharmony_ci              File "{filename}", lineno 3
10027db96d56Sopenharmony_ci                f = open(__file__, "rb")
10037db96d56Sopenharmony_ci        ''').strip()
10047db96d56Sopenharmony_ci        self.assertEqual(stderr, expected)
10057db96d56Sopenharmony_ci
10067db96d56Sopenharmony_ci
10077db96d56Sopenharmony_ciclass CatchWarningTests(BaseTest):
10087db96d56Sopenharmony_ci
10097db96d56Sopenharmony_ci    """Test catch_warnings()."""
10107db96d56Sopenharmony_ci
10117db96d56Sopenharmony_ci    def test_catch_warnings_restore(self):
10127db96d56Sopenharmony_ci        wmod = self.module
10137db96d56Sopenharmony_ci        orig_filters = wmod.filters
10147db96d56Sopenharmony_ci        orig_showwarning = wmod.showwarning
10157db96d56Sopenharmony_ci        # Ensure both showwarning and filters are restored when recording
10167db96d56Sopenharmony_ci        with wmod.catch_warnings(module=wmod, record=True):
10177db96d56Sopenharmony_ci            wmod.filters = wmod.showwarning = object()
10187db96d56Sopenharmony_ci        self.assertIs(wmod.filters, orig_filters)
10197db96d56Sopenharmony_ci        self.assertIs(wmod.showwarning, orig_showwarning)
10207db96d56Sopenharmony_ci        # Same test, but with recording disabled
10217db96d56Sopenharmony_ci        with wmod.catch_warnings(module=wmod, record=False):
10227db96d56Sopenharmony_ci            wmod.filters = wmod.showwarning = object()
10237db96d56Sopenharmony_ci        self.assertIs(wmod.filters, orig_filters)
10247db96d56Sopenharmony_ci        self.assertIs(wmod.showwarning, orig_showwarning)
10257db96d56Sopenharmony_ci
10267db96d56Sopenharmony_ci    def test_catch_warnings_recording(self):
10277db96d56Sopenharmony_ci        wmod = self.module
10287db96d56Sopenharmony_ci        # Ensure warnings are recorded when requested
10297db96d56Sopenharmony_ci        with wmod.catch_warnings(module=wmod, record=True) as w:
10307db96d56Sopenharmony_ci            self.assertEqual(w, [])
10317db96d56Sopenharmony_ci            self.assertIs(type(w), list)
10327db96d56Sopenharmony_ci            wmod.simplefilter("always")
10337db96d56Sopenharmony_ci            wmod.warn("foo")
10347db96d56Sopenharmony_ci            self.assertEqual(str(w[-1].message), "foo")
10357db96d56Sopenharmony_ci            wmod.warn("bar")
10367db96d56Sopenharmony_ci            self.assertEqual(str(w[-1].message), "bar")
10377db96d56Sopenharmony_ci            self.assertEqual(str(w[0].message), "foo")
10387db96d56Sopenharmony_ci            self.assertEqual(str(w[1].message), "bar")
10397db96d56Sopenharmony_ci            del w[:]
10407db96d56Sopenharmony_ci            self.assertEqual(w, [])
10417db96d56Sopenharmony_ci        # Ensure warnings are not recorded when not requested
10427db96d56Sopenharmony_ci        orig_showwarning = wmod.showwarning
10437db96d56Sopenharmony_ci        with wmod.catch_warnings(module=wmod, record=False) as w:
10447db96d56Sopenharmony_ci            self.assertIsNone(w)
10457db96d56Sopenharmony_ci            self.assertIs(wmod.showwarning, orig_showwarning)
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ci    def test_catch_warnings_reentry_guard(self):
10487db96d56Sopenharmony_ci        wmod = self.module
10497db96d56Sopenharmony_ci        # Ensure catch_warnings is protected against incorrect usage
10507db96d56Sopenharmony_ci        x = wmod.catch_warnings(module=wmod, record=True)
10517db96d56Sopenharmony_ci        self.assertRaises(RuntimeError, x.__exit__)
10527db96d56Sopenharmony_ci        with x:
10537db96d56Sopenharmony_ci            self.assertRaises(RuntimeError, x.__enter__)
10547db96d56Sopenharmony_ci        # Same test, but with recording disabled
10557db96d56Sopenharmony_ci        x = wmod.catch_warnings(module=wmod, record=False)
10567db96d56Sopenharmony_ci        self.assertRaises(RuntimeError, x.__exit__)
10577db96d56Sopenharmony_ci        with x:
10587db96d56Sopenharmony_ci            self.assertRaises(RuntimeError, x.__enter__)
10597db96d56Sopenharmony_ci
10607db96d56Sopenharmony_ci    def test_catch_warnings_defaults(self):
10617db96d56Sopenharmony_ci        wmod = self.module
10627db96d56Sopenharmony_ci        orig_filters = wmod.filters
10637db96d56Sopenharmony_ci        orig_showwarning = wmod.showwarning
10647db96d56Sopenharmony_ci        # Ensure default behaviour is not to record warnings
10657db96d56Sopenharmony_ci        with wmod.catch_warnings(module=wmod) as w:
10667db96d56Sopenharmony_ci            self.assertIsNone(w)
10677db96d56Sopenharmony_ci            self.assertIs(wmod.showwarning, orig_showwarning)
10687db96d56Sopenharmony_ci            self.assertIsNot(wmod.filters, orig_filters)
10697db96d56Sopenharmony_ci        self.assertIs(wmod.filters, orig_filters)
10707db96d56Sopenharmony_ci        if wmod is sys.modules['warnings']:
10717db96d56Sopenharmony_ci            # Ensure the default module is this one
10727db96d56Sopenharmony_ci            with wmod.catch_warnings() as w:
10737db96d56Sopenharmony_ci                self.assertIsNone(w)
10747db96d56Sopenharmony_ci                self.assertIs(wmod.showwarning, orig_showwarning)
10757db96d56Sopenharmony_ci                self.assertIsNot(wmod.filters, orig_filters)
10767db96d56Sopenharmony_ci            self.assertIs(wmod.filters, orig_filters)
10777db96d56Sopenharmony_ci
10787db96d56Sopenharmony_ci    def test_record_override_showwarning_before(self):
10797db96d56Sopenharmony_ci        # Issue #28835: If warnings.showwarning() was overridden, make sure
10807db96d56Sopenharmony_ci        # that catch_warnings(record=True) overrides it again.
10817db96d56Sopenharmony_ci        text = "This is a warning"
10827db96d56Sopenharmony_ci        wmod = self.module
10837db96d56Sopenharmony_ci        my_log = []
10847db96d56Sopenharmony_ci
10857db96d56Sopenharmony_ci        def my_logger(message, category, filename, lineno, file=None, line=None):
10867db96d56Sopenharmony_ci            nonlocal my_log
10877db96d56Sopenharmony_ci            my_log.append(message)
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ci        # Override warnings.showwarning() before calling catch_warnings()
10907db96d56Sopenharmony_ci        with support.swap_attr(wmod, 'showwarning', my_logger):
10917db96d56Sopenharmony_ci            with wmod.catch_warnings(module=wmod, record=True) as log:
10927db96d56Sopenharmony_ci                self.assertIsNot(wmod.showwarning, my_logger)
10937db96d56Sopenharmony_ci
10947db96d56Sopenharmony_ci                wmod.simplefilter("always")
10957db96d56Sopenharmony_ci                wmod.warn(text)
10967db96d56Sopenharmony_ci
10977db96d56Sopenharmony_ci            self.assertIs(wmod.showwarning, my_logger)
10987db96d56Sopenharmony_ci
10997db96d56Sopenharmony_ci        self.assertEqual(len(log), 1, log)
11007db96d56Sopenharmony_ci        self.assertEqual(log[0].message.args[0], text)
11017db96d56Sopenharmony_ci        self.assertEqual(my_log, [])
11027db96d56Sopenharmony_ci
11037db96d56Sopenharmony_ci    def test_record_override_showwarning_inside(self):
11047db96d56Sopenharmony_ci        # Issue #28835: It is possible to override warnings.showwarning()
11057db96d56Sopenharmony_ci        # in the catch_warnings(record=True) context manager.
11067db96d56Sopenharmony_ci        text = "This is a warning"
11077db96d56Sopenharmony_ci        wmod = self.module
11087db96d56Sopenharmony_ci        my_log = []
11097db96d56Sopenharmony_ci
11107db96d56Sopenharmony_ci        def my_logger(message, category, filename, lineno, file=None, line=None):
11117db96d56Sopenharmony_ci            nonlocal my_log
11127db96d56Sopenharmony_ci            my_log.append(message)
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ci        with wmod.catch_warnings(module=wmod, record=True) as log:
11157db96d56Sopenharmony_ci            wmod.simplefilter("always")
11167db96d56Sopenharmony_ci            wmod.showwarning = my_logger
11177db96d56Sopenharmony_ci            wmod.warn(text)
11187db96d56Sopenharmony_ci
11197db96d56Sopenharmony_ci        self.assertEqual(len(my_log), 1, my_log)
11207db96d56Sopenharmony_ci        self.assertEqual(my_log[0].args[0], text)
11217db96d56Sopenharmony_ci        self.assertEqual(log, [])
11227db96d56Sopenharmony_ci
11237db96d56Sopenharmony_ci    def test_check_warnings(self):
11247db96d56Sopenharmony_ci        # Explicit tests for the test.support convenience wrapper
11257db96d56Sopenharmony_ci        wmod = self.module
11267db96d56Sopenharmony_ci        if wmod is not sys.modules['warnings']:
11277db96d56Sopenharmony_ci            self.skipTest('module to test is not loaded warnings module')
11287db96d56Sopenharmony_ci        with warnings_helper.check_warnings(quiet=False) as w:
11297db96d56Sopenharmony_ci            self.assertEqual(w.warnings, [])
11307db96d56Sopenharmony_ci            wmod.simplefilter("always")
11317db96d56Sopenharmony_ci            wmod.warn("foo")
11327db96d56Sopenharmony_ci            self.assertEqual(str(w.message), "foo")
11337db96d56Sopenharmony_ci            wmod.warn("bar")
11347db96d56Sopenharmony_ci            self.assertEqual(str(w.message), "bar")
11357db96d56Sopenharmony_ci            self.assertEqual(str(w.warnings[0].message), "foo")
11367db96d56Sopenharmony_ci            self.assertEqual(str(w.warnings[1].message), "bar")
11377db96d56Sopenharmony_ci            w.reset()
11387db96d56Sopenharmony_ci            self.assertEqual(w.warnings, [])
11397db96d56Sopenharmony_ci
11407db96d56Sopenharmony_ci        with warnings_helper.check_warnings():
11417db96d56Sopenharmony_ci            # defaults to quiet=True without argument
11427db96d56Sopenharmony_ci            pass
11437db96d56Sopenharmony_ci        with warnings_helper.check_warnings(('foo', UserWarning)):
11447db96d56Sopenharmony_ci            wmod.warn("foo")
11457db96d56Sopenharmony_ci
11467db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
11477db96d56Sopenharmony_ci            with warnings_helper.check_warnings(('', RuntimeWarning)):
11487db96d56Sopenharmony_ci                # defaults to quiet=False with argument
11497db96d56Sopenharmony_ci                pass
11507db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
11517db96d56Sopenharmony_ci            with warnings_helper.check_warnings(('foo', RuntimeWarning)):
11527db96d56Sopenharmony_ci                wmod.warn("foo")
11537db96d56Sopenharmony_ci
11547db96d56Sopenharmony_ciclass CCatchWarningTests(CatchWarningTests, unittest.TestCase):
11557db96d56Sopenharmony_ci    module = c_warnings
11567db96d56Sopenharmony_ci
11577db96d56Sopenharmony_ciclass PyCatchWarningTests(CatchWarningTests, unittest.TestCase):
11587db96d56Sopenharmony_ci    module = py_warnings
11597db96d56Sopenharmony_ci
11607db96d56Sopenharmony_ci
11617db96d56Sopenharmony_ciclass EnvironmentVariableTests(BaseTest):
11627db96d56Sopenharmony_ci
11637db96d56Sopenharmony_ci    def test_single_warning(self):
11647db96d56Sopenharmony_ci        rc, stdout, stderr = assert_python_ok("-c",
11657db96d56Sopenharmony_ci            "import sys; sys.stdout.write(str(sys.warnoptions))",
11667db96d56Sopenharmony_ci            PYTHONWARNINGS="ignore::DeprecationWarning",
11677db96d56Sopenharmony_ci            PYTHONDEVMODE="")
11687db96d56Sopenharmony_ci        self.assertEqual(stdout, b"['ignore::DeprecationWarning']")
11697db96d56Sopenharmony_ci
11707db96d56Sopenharmony_ci    def test_comma_separated_warnings(self):
11717db96d56Sopenharmony_ci        rc, stdout, stderr = assert_python_ok("-c",
11727db96d56Sopenharmony_ci            "import sys; sys.stdout.write(str(sys.warnoptions))",
11737db96d56Sopenharmony_ci            PYTHONWARNINGS="ignore::DeprecationWarning,ignore::UnicodeWarning",
11747db96d56Sopenharmony_ci            PYTHONDEVMODE="")
11757db96d56Sopenharmony_ci        self.assertEqual(stdout,
11767db96d56Sopenharmony_ci            b"['ignore::DeprecationWarning', 'ignore::UnicodeWarning']")
11777db96d56Sopenharmony_ci
11787db96d56Sopenharmony_ci    def test_envvar_and_command_line(self):
11797db96d56Sopenharmony_ci        rc, stdout, stderr = assert_python_ok("-Wignore::UnicodeWarning", "-c",
11807db96d56Sopenharmony_ci            "import sys; sys.stdout.write(str(sys.warnoptions))",
11817db96d56Sopenharmony_ci            PYTHONWARNINGS="ignore::DeprecationWarning",
11827db96d56Sopenharmony_ci            PYTHONDEVMODE="")
11837db96d56Sopenharmony_ci        self.assertEqual(stdout,
11847db96d56Sopenharmony_ci            b"['ignore::DeprecationWarning', 'ignore::UnicodeWarning']")
11857db96d56Sopenharmony_ci
11867db96d56Sopenharmony_ci    def test_conflicting_envvar_and_command_line(self):
11877db96d56Sopenharmony_ci        rc, stdout, stderr = assert_python_failure("-Werror::DeprecationWarning", "-c",
11887db96d56Sopenharmony_ci            "import sys, warnings; sys.stdout.write(str(sys.warnoptions)); "
11897db96d56Sopenharmony_ci            "warnings.warn('Message', DeprecationWarning)",
11907db96d56Sopenharmony_ci            PYTHONWARNINGS="default::DeprecationWarning",
11917db96d56Sopenharmony_ci            PYTHONDEVMODE="")
11927db96d56Sopenharmony_ci        self.assertEqual(stdout,
11937db96d56Sopenharmony_ci            b"['default::DeprecationWarning', 'error::DeprecationWarning']")
11947db96d56Sopenharmony_ci        self.assertEqual(stderr.splitlines(),
11957db96d56Sopenharmony_ci            [b"Traceback (most recent call last):",
11967db96d56Sopenharmony_ci             b"  File \"<string>\", line 1, in <module>",
11977db96d56Sopenharmony_ci             b"DeprecationWarning: Message"])
11987db96d56Sopenharmony_ci
11997db96d56Sopenharmony_ci    def test_default_filter_configuration(self):
12007db96d56Sopenharmony_ci        pure_python_api = self.module is py_warnings
12017db96d56Sopenharmony_ci        if Py_DEBUG:
12027db96d56Sopenharmony_ci            expected_default_filters = []
12037db96d56Sopenharmony_ci        else:
12047db96d56Sopenharmony_ci            if pure_python_api:
12057db96d56Sopenharmony_ci                main_module_filter = re.compile("__main__")
12067db96d56Sopenharmony_ci            else:
12077db96d56Sopenharmony_ci                main_module_filter = "__main__"
12087db96d56Sopenharmony_ci            expected_default_filters = [
12097db96d56Sopenharmony_ci                ('default', None, DeprecationWarning, main_module_filter, 0),
12107db96d56Sopenharmony_ci                ('ignore', None, DeprecationWarning, None, 0),
12117db96d56Sopenharmony_ci                ('ignore', None, PendingDeprecationWarning, None, 0),
12127db96d56Sopenharmony_ci                ('ignore', None, ImportWarning, None, 0),
12137db96d56Sopenharmony_ci                ('ignore', None, ResourceWarning, None, 0),
12147db96d56Sopenharmony_ci            ]
12157db96d56Sopenharmony_ci        expected_output = [str(f).encode() for f in expected_default_filters]
12167db96d56Sopenharmony_ci
12177db96d56Sopenharmony_ci        if pure_python_api:
12187db96d56Sopenharmony_ci            # Disable the warnings acceleration module in the subprocess
12197db96d56Sopenharmony_ci            code = "import sys; sys.modules.pop('warnings', None); sys.modules['_warnings'] = None; "
12207db96d56Sopenharmony_ci        else:
12217db96d56Sopenharmony_ci            code = ""
12227db96d56Sopenharmony_ci        code += "import warnings; [print(f) for f in warnings.filters]"
12237db96d56Sopenharmony_ci
12247db96d56Sopenharmony_ci        rc, stdout, stderr = assert_python_ok("-c", code, __isolated=True)
12257db96d56Sopenharmony_ci        stdout_lines = [line.strip() for line in stdout.splitlines()]
12267db96d56Sopenharmony_ci        self.maxDiff = None
12277db96d56Sopenharmony_ci        self.assertEqual(stdout_lines, expected_output)
12287db96d56Sopenharmony_ci
12297db96d56Sopenharmony_ci
12307db96d56Sopenharmony_ci    @unittest.skipUnless(sys.getfilesystemencoding() != 'ascii',
12317db96d56Sopenharmony_ci                         'requires non-ascii filesystemencoding')
12327db96d56Sopenharmony_ci    def test_nonascii(self):
12337db96d56Sopenharmony_ci        PYTHONWARNINGS="ignore:DeprecationWarning" + os_helper.FS_NONASCII
12347db96d56Sopenharmony_ci        rc, stdout, stderr = assert_python_ok("-c",
12357db96d56Sopenharmony_ci            "import sys; sys.stdout.write(str(sys.warnoptions))",
12367db96d56Sopenharmony_ci            PYTHONIOENCODING="utf-8",
12377db96d56Sopenharmony_ci            PYTHONWARNINGS=PYTHONWARNINGS,
12387db96d56Sopenharmony_ci            PYTHONDEVMODE="")
12397db96d56Sopenharmony_ci        self.assertEqual(stdout, str([PYTHONWARNINGS]).encode())
12407db96d56Sopenharmony_ci
12417db96d56Sopenharmony_ciclass CEnvironmentVariableTests(EnvironmentVariableTests, unittest.TestCase):
12427db96d56Sopenharmony_ci    module = c_warnings
12437db96d56Sopenharmony_ci
12447db96d56Sopenharmony_ciclass PyEnvironmentVariableTests(EnvironmentVariableTests, unittest.TestCase):
12457db96d56Sopenharmony_ci    module = py_warnings
12467db96d56Sopenharmony_ci
12477db96d56Sopenharmony_ci
12487db96d56Sopenharmony_ciclass _DeprecatedTest(BaseTest, unittest.TestCase):
12497db96d56Sopenharmony_ci
12507db96d56Sopenharmony_ci    """Test _deprecated()."""
12517db96d56Sopenharmony_ci
12527db96d56Sopenharmony_ci    module = original_warnings
12537db96d56Sopenharmony_ci
12547db96d56Sopenharmony_ci    def test_warning(self):
12557db96d56Sopenharmony_ci        version = (3, 11, 0, "final", 0)
12567db96d56Sopenharmony_ci        test = [(4, 12), (4, 11), (4, 0), (3, 12)]
12577db96d56Sopenharmony_ci        for remove in test:
12587db96d56Sopenharmony_ci            msg = rf".*test_warnings.*{remove[0]}\.{remove[1]}"
12597db96d56Sopenharmony_ci            filter = msg, DeprecationWarning
12607db96d56Sopenharmony_ci            with self.subTest(remove=remove):
12617db96d56Sopenharmony_ci                with warnings_helper.check_warnings(filter, quiet=False):
12627db96d56Sopenharmony_ci                    self.module._deprecated("test_warnings", remove=remove,
12637db96d56Sopenharmony_ci                                            _version=version)
12647db96d56Sopenharmony_ci
12657db96d56Sopenharmony_ci        version = (3, 11, 0, "alpha", 0)
12667db96d56Sopenharmony_ci        msg = r".*test_warnings.*3\.11"
12677db96d56Sopenharmony_ci        with warnings_helper.check_warnings((msg, DeprecationWarning), quiet=False):
12687db96d56Sopenharmony_ci            self.module._deprecated("test_warnings", remove=(3, 11),
12697db96d56Sopenharmony_ci                                    _version=version)
12707db96d56Sopenharmony_ci
12717db96d56Sopenharmony_ci    def test_RuntimeError(self):
12727db96d56Sopenharmony_ci        version = (3, 11, 0, "final", 0)
12737db96d56Sopenharmony_ci        test = [(2, 0), (2, 12), (3, 10)]
12747db96d56Sopenharmony_ci        for remove in test:
12757db96d56Sopenharmony_ci            with self.subTest(remove=remove):
12767db96d56Sopenharmony_ci                with self.assertRaises(RuntimeError):
12777db96d56Sopenharmony_ci                    self.module._deprecated("test_warnings", remove=remove,
12787db96d56Sopenharmony_ci                                            _version=version)
12797db96d56Sopenharmony_ci        for level in ["beta", "candidate", "final"]:
12807db96d56Sopenharmony_ci            version = (3, 11, 0, level, 0)
12817db96d56Sopenharmony_ci            with self.subTest(releaselevel=level):
12827db96d56Sopenharmony_ci                with self.assertRaises(RuntimeError):
12837db96d56Sopenharmony_ci                    self.module._deprecated("test_warnings", remove=(3, 11),
12847db96d56Sopenharmony_ci                                            _version=version)
12857db96d56Sopenharmony_ci
12867db96d56Sopenharmony_ci
12877db96d56Sopenharmony_ciclass BootstrapTest(unittest.TestCase):
12887db96d56Sopenharmony_ci
12897db96d56Sopenharmony_ci    def test_issue_8766(self):
12907db96d56Sopenharmony_ci        # "import encodings" emits a warning whereas the warnings is not loaded
12917db96d56Sopenharmony_ci        # or not completely loaded (warnings imports indirectly encodings by
12927db96d56Sopenharmony_ci        # importing linecache) yet
12937db96d56Sopenharmony_ci        with os_helper.temp_cwd() as cwd, os_helper.temp_cwd('encodings'):
12947db96d56Sopenharmony_ci            # encodings loaded by initfsencoding()
12957db96d56Sopenharmony_ci            assert_python_ok('-c', 'pass', PYTHONPATH=cwd)
12967db96d56Sopenharmony_ci
12977db96d56Sopenharmony_ci            # Use -W to load warnings module at startup
12987db96d56Sopenharmony_ci            assert_python_ok('-c', 'pass', '-W', 'always', PYTHONPATH=cwd)
12997db96d56Sopenharmony_ci
13007db96d56Sopenharmony_ci
13017db96d56Sopenharmony_ciclass FinalizationTest(unittest.TestCase):
13027db96d56Sopenharmony_ci    def test_finalization(self):
13037db96d56Sopenharmony_ci        # Issue #19421: warnings.warn() should not crash
13047db96d56Sopenharmony_ci        # during Python finalization
13057db96d56Sopenharmony_ci        code = """
13067db96d56Sopenharmony_ciimport warnings
13077db96d56Sopenharmony_ciwarn = warnings.warn
13087db96d56Sopenharmony_ci
13097db96d56Sopenharmony_ciclass A:
13107db96d56Sopenharmony_ci    def __del__(self):
13117db96d56Sopenharmony_ci        warn("test")
13127db96d56Sopenharmony_ci
13137db96d56Sopenharmony_cia=A()
13147db96d56Sopenharmony_ci        """
13157db96d56Sopenharmony_ci        rc, out, err = assert_python_ok("-c", code)
13167db96d56Sopenharmony_ci        self.assertEqual(err.decode().rstrip(),
13177db96d56Sopenharmony_ci                         '<string>:7: UserWarning: test')
13187db96d56Sopenharmony_ci
13197db96d56Sopenharmony_ci    def test_late_resource_warning(self):
13207db96d56Sopenharmony_ci        # Issue #21925: Emitting a ResourceWarning late during the Python
13217db96d56Sopenharmony_ci        # shutdown must be logged.
13227db96d56Sopenharmony_ci
13237db96d56Sopenharmony_ci        expected = b"sys:1: ResourceWarning: unclosed file "
13247db96d56Sopenharmony_ci
13257db96d56Sopenharmony_ci        # don't import the warnings module
13267db96d56Sopenharmony_ci        # (_warnings will try to import it)
13277db96d56Sopenharmony_ci        code = "f = open(%a)" % __file__
13287db96d56Sopenharmony_ci        rc, out, err = assert_python_ok("-Wd", "-c", code)
13297db96d56Sopenharmony_ci        self.assertTrue(err.startswith(expected), ascii(err))
13307db96d56Sopenharmony_ci
13317db96d56Sopenharmony_ci        # import the warnings module
13327db96d56Sopenharmony_ci        code = "import warnings; f = open(%a)" % __file__
13337db96d56Sopenharmony_ci        rc, out, err = assert_python_ok("-Wd", "-c", code)
13347db96d56Sopenharmony_ci        self.assertTrue(err.startswith(expected), ascii(err))
13357db96d56Sopenharmony_ci
13367db96d56Sopenharmony_ci
13377db96d56Sopenharmony_cidef setUpModule():
13387db96d56Sopenharmony_ci    py_warnings.onceregistry.clear()
13397db96d56Sopenharmony_ci    c_warnings.onceregistry.clear()
13407db96d56Sopenharmony_ci
13417db96d56Sopenharmony_citearDownModule = setUpModule
13427db96d56Sopenharmony_ci
13437db96d56Sopenharmony_ciif __name__ == "__main__":
13447db96d56Sopenharmony_ci    unittest.main()
1345