From 680eaefc15bbcfbb82c09d36f243b19d4ebeb194 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 24 Jul 2024 13:31:40 +0300 Subject: [PATCH 1/3] gh-86298: Add black box tests in test_warnings They are similar to white box tests in test_importlib. --- Lib/test/test_warnings/__init__.py | 85 ++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 7d04371c94abda..b9ebbd641ed0b0 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -955,6 +955,91 @@ def test_issue31566(self): support.swap_item(globals(), '__file__', None): self.assertRaises(UserWarning, self.module.warn, 'bar') + def check_module_globals(self, module_globals): + with original_warnings.catch_warnings(module=self.module, record=True) as w: + self.module.filterwarnings('default') + self.module.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals=module_globals) + self.assertEqual(len(w), 1) + self.assertEqual(w[0].category, UserWarning) + self.assertEqual(str(w[0].message), 'eggs') + + def check_module_globals_error(self, module_globals, errmsg, errtype=ValueError): + with original_warnings.catch_warnings(module=self.module, record=True) as w: + self.module.filterwarnings('default') + with self.assertRaisesRegex(errtype, re.escape(errmsg)): + self.module.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals=module_globals) + self.assertEqual(len(w), 0) + + def check_module_globals_deprecated(self, module_globals, msg): + with original_warnings.catch_warnings(module=self.module, record=True) as w: + self.module.filterwarnings('default') + self.module.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals=module_globals) + self.assertEqual(len(w), 2) + self.assertEqual(w[0].category, DeprecationWarning) + self.assertEqual(str(w[0].message), msg) + self.assertEqual(w[1].category, UserWarning) + self.assertEqual(str(w[1].message), 'eggs') + + def test_gh86298_no_loader_and_no_spec(self): + self.check_module_globals({'__name__': 'bar'}) + + def test_gh86298_loader_is_none_and_no_spec(self): + self.check_module_globals({'__name__': 'bar', '__loader__': None}) + + def test_gh86298_no_loader_and_spec_is_none(self): + self.check_module_globals_error( + {'__name__': 'bar', '__spec__': None}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_loader_is_none_and_spec_is_none(self): + self.check_module_globals_error( + {'__name__': 'bar', '__loader__': None, '__spec__': None}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_loader_is_none_and_spec_loader_is_none(self): + self.check_module_globals_error( + {'__name__': 'bar', '__loader__': None, + '__spec__': types.SimpleNamespace(loader=None)}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_no_spec(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object()}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_spec_is_none(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object(), '__spec__': None}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_no_spec_loader(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object(), + '__spec__': types.SimpleNamespace()}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_loader_and_spec_loader_disagree(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object(), + '__spec__': types.SimpleNamespace(loader=object())}, + 'Module globals; __loader__ != __spec__.loader') + + def test_gh86298_no_loader_and_no_spec_loader(self): + self.check_module_globals_error( + {'__name__': 'bar', '__spec__': types.SimpleNamespace()}, + 'Module globals is missing a __spec__.loader', AttributeError) + + def test_gh86298_no_loader_with_spec_loader_okay(self): + self.check_module_globals( + {'__name__': 'bar', + '__spec__': types.SimpleNamespace(loader=object())}) + class WarningsDisplayTests(BaseTest): From ef9cb0fb7af4816e46346e62c72c4365007a5f95 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 24 Jul 2024 17:11:09 +0300 Subject: [PATCH 2/3] Test also with the Python implementation. --- Lib/test/test_warnings/__init__.py | 176 +++++++++++++++-------------- 1 file changed, 91 insertions(+), 85 deletions(-) diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index b9ebbd641ed0b0..6f5d28e3f1cad1 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -639,6 +639,97 @@ class NonWarningSubclass: self.module.warn('good warning category', MyWarningClass) self.assertIsInstance(cm.warning, Warning) + def check_module_globals(self, module_globals): + with original_warnings.catch_warnings(module=self.module, record=True) as w: + self.module.filterwarnings('default') + self.module.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals=module_globals) + self.assertEqual(len(w), 1) + self.assertEqual(w[0].category, UserWarning) + self.assertEqual(str(w[0].message), 'eggs') + + def check_module_globals_error(self, module_globals, errmsg, errtype=ValueError): + if self.module is py_warnings: + self.check_module_globals(module_globals) + return + with original_warnings.catch_warnings(module=self.module, record=True) as w: + self.module.filterwarnings('default') + with self.assertRaisesRegex(errtype, re.escape(errmsg)): + self.module.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals=module_globals) + self.assertEqual(len(w), 0) + + def check_module_globals_deprecated(self, module_globals, msg): + if self.module is py_warnings: + self.check_module_globals(module_globals) + return + with original_warnings.catch_warnings(module=self.module, record=True) as w: + self.module.filterwarnings('default') + self.module.warn_explicit( + 'eggs', UserWarning, 'bar', 1, + module_globals=module_globals) + self.assertEqual(len(w), 2) + self.assertEqual(w[0].category, DeprecationWarning) + self.assertEqual(str(w[0].message), msg) + self.assertEqual(w[1].category, UserWarning) + self.assertEqual(str(w[1].message), 'eggs') + + def test_gh86298_no_loader_and_no_spec(self): + self.check_module_globals({'__name__': 'bar'}) + + def test_gh86298_loader_is_none_and_no_spec(self): + self.check_module_globals({'__name__': 'bar', '__loader__': None}) + + def test_gh86298_no_loader_and_spec_is_none(self): + self.check_module_globals_error( + {'__name__': 'bar', '__spec__': None}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_loader_is_none_and_spec_is_none(self): + self.check_module_globals_error( + {'__name__': 'bar', '__loader__': None, '__spec__': None}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_loader_is_none_and_spec_loader_is_none(self): + self.check_module_globals_error( + {'__name__': 'bar', '__loader__': None, + '__spec__': types.SimpleNamespace(loader=None)}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_no_spec(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object()}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_spec_is_none(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object(), '__spec__': None}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_no_spec_loader(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object(), + '__spec__': types.SimpleNamespace()}, + 'Module globals is missing a __spec__.loader') + + def test_gh86298_loader_and_spec_loader_disagree(self): + self.check_module_globals_deprecated( + {'__name__': 'bar', '__loader__': object(), + '__spec__': types.SimpleNamespace(loader=object())}, + 'Module globals; __loader__ != __spec__.loader') + + def test_gh86298_no_loader_and_no_spec_loader(self): + self.check_module_globals_error( + {'__name__': 'bar', '__spec__': types.SimpleNamespace()}, + 'Module globals is missing a __spec__.loader', AttributeError) + + def test_gh86298_no_loader_with_spec_loader_okay(self): + self.check_module_globals( + {'__name__': 'bar', + '__spec__': types.SimpleNamespace(loader=object())}) + class CWarnTests(WarnTests, unittest.TestCase): module = c_warnings @@ -955,91 +1046,6 @@ def test_issue31566(self): support.swap_item(globals(), '__file__', None): self.assertRaises(UserWarning, self.module.warn, 'bar') - def check_module_globals(self, module_globals): - with original_warnings.catch_warnings(module=self.module, record=True) as w: - self.module.filterwarnings('default') - self.module.warn_explicit( - 'eggs', UserWarning, 'bar', 1, - module_globals=module_globals) - self.assertEqual(len(w), 1) - self.assertEqual(w[0].category, UserWarning) - self.assertEqual(str(w[0].message), 'eggs') - - def check_module_globals_error(self, module_globals, errmsg, errtype=ValueError): - with original_warnings.catch_warnings(module=self.module, record=True) as w: - self.module.filterwarnings('default') - with self.assertRaisesRegex(errtype, re.escape(errmsg)): - self.module.warn_explicit( - 'eggs', UserWarning, 'bar', 1, - module_globals=module_globals) - self.assertEqual(len(w), 0) - - def check_module_globals_deprecated(self, module_globals, msg): - with original_warnings.catch_warnings(module=self.module, record=True) as w: - self.module.filterwarnings('default') - self.module.warn_explicit( - 'eggs', UserWarning, 'bar', 1, - module_globals=module_globals) - self.assertEqual(len(w), 2) - self.assertEqual(w[0].category, DeprecationWarning) - self.assertEqual(str(w[0].message), msg) - self.assertEqual(w[1].category, UserWarning) - self.assertEqual(str(w[1].message), 'eggs') - - def test_gh86298_no_loader_and_no_spec(self): - self.check_module_globals({'__name__': 'bar'}) - - def test_gh86298_loader_is_none_and_no_spec(self): - self.check_module_globals({'__name__': 'bar', '__loader__': None}) - - def test_gh86298_no_loader_and_spec_is_none(self): - self.check_module_globals_error( - {'__name__': 'bar', '__spec__': None}, - 'Module globals is missing a __spec__.loader') - - def test_gh86298_loader_is_none_and_spec_is_none(self): - self.check_module_globals_error( - {'__name__': 'bar', '__loader__': None, '__spec__': None}, - 'Module globals is missing a __spec__.loader') - - def test_gh86298_loader_is_none_and_spec_loader_is_none(self): - self.check_module_globals_error( - {'__name__': 'bar', '__loader__': None, - '__spec__': types.SimpleNamespace(loader=None)}, - 'Module globals is missing a __spec__.loader') - - def test_gh86298_no_spec(self): - self.check_module_globals_deprecated( - {'__name__': 'bar', '__loader__': object()}, - 'Module globals is missing a __spec__.loader') - - def test_gh86298_spec_is_none(self): - self.check_module_globals_deprecated( - {'__name__': 'bar', '__loader__': object(), '__spec__': None}, - 'Module globals is missing a __spec__.loader') - - def test_gh86298_no_spec_loader(self): - self.check_module_globals_deprecated( - {'__name__': 'bar', '__loader__': object(), - '__spec__': types.SimpleNamespace()}, - 'Module globals is missing a __spec__.loader') - - def test_gh86298_loader_and_spec_loader_disagree(self): - self.check_module_globals_deprecated( - {'__name__': 'bar', '__loader__': object(), - '__spec__': types.SimpleNamespace(loader=object())}, - 'Module globals; __loader__ != __spec__.loader') - - def test_gh86298_no_loader_and_no_spec_loader(self): - self.check_module_globals_error( - {'__name__': 'bar', '__spec__': types.SimpleNamespace()}, - 'Module globals is missing a __spec__.loader', AttributeError) - - def test_gh86298_no_loader_with_spec_loader_okay(self): - self.check_module_globals( - {'__name__': 'bar', - '__spec__': types.SimpleNamespace(loader=object())}) - class WarningsDisplayTests(BaseTest): From 6c73ece3a4650eabf355f7f72024b90c724f15af Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 24 Jul 2024 17:41:45 +0300 Subject: [PATCH 3/3] Use "always" filter. --- Lib/test/test_warnings/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index 6f5d28e3f1cad1..117d31c05d7e7b 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -654,7 +654,7 @@ def check_module_globals_error(self, module_globals, errmsg, errtype=ValueError) self.check_module_globals(module_globals) return with original_warnings.catch_warnings(module=self.module, record=True) as w: - self.module.filterwarnings('default') + self.module.filterwarnings('always') with self.assertRaisesRegex(errtype, re.escape(errmsg)): self.module.warn_explicit( 'eggs', UserWarning, 'bar', 1, @@ -666,7 +666,7 @@ def check_module_globals_deprecated(self, module_globals, msg): self.check_module_globals(module_globals) return with original_warnings.catch_warnings(module=self.module, record=True) as w: - self.module.filterwarnings('default') + self.module.filterwarnings('always') self.module.warn_explicit( 'eggs', UserWarning, 'bar', 1, module_globals=module_globals)