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