summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorŁukasz Langa <lukasz@langa.pl>2021-08-17 10:01:00 (GMT)
committerGitHub <noreply@github.com>2021-08-17 10:01:00 (GMT)
commitbc98f981326d7cb30f939dedd04b91f378255d88 (patch)
treed4897d6c85fc9cc5626b91ec0f73d49b1c6ed62a
parent6f6648e436d02bce0e49ba82f4377c0d2f586f0f (diff)
downloadcpython-bc98f981326d7cb30f939dedd04b91f378255d88.zip
cpython-bc98f981326d7cb30f939dedd04b91f378255d88.tar.gz
cpython-bc98f981326d7cb30f939dedd04b91f378255d88.tar.bz2
[3.10] bpo-44852: Support ignoring specific DeprecationWarnings wholesale in regrtest (GH-27634) (GH-27784)
(cherry picked from commit a0a6d39295a30434b088f4b66439bf5ea21a3e4e) Co-authored-by: Łukasz Langa <lukasz@langa.pl>
-rw-r--r--Lib/test/support/__init__.py31
-rw-r--r--Lib/test/support/warnings_helper.py10
-rw-r--r--Lib/test/test_support.py29
-rw-r--r--Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst2
4 files changed, 72 insertions, 0 deletions
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index cb3acec..227ce47 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -13,6 +13,7 @@ import sysconfig
import time
import types
import unittest
+import warnings
from .testresult import get_test_runner
@@ -2040,3 +2041,33 @@ def check_disallow_instantiation(testcase, tp, *args, **kwds):
qualname = f"{name}"
msg = f"cannot create '{re.escape(qualname)}' instances"
testcase.assertRaisesRegex(TypeError, msg, tp, *args, **kwds)
+
+
+def ignore_deprecations_from(module: str, *, like: str) -> object:
+ token = object()
+ warnings.filterwarnings(
+ "ignore",
+ category=DeprecationWarning,
+ module=module,
+ message=like + fr"(?#support{id(token)})",
+ )
+ return token
+
+
+def clear_ignored_deprecations(*tokens: object) -> None:
+ if not tokens:
+ raise ValueError("Provide token or tokens returned by ignore_deprecations_from")
+
+ new_filters = []
+ for action, message, category, module, lineno in warnings.filters:
+ if action == "ignore" and category is DeprecationWarning:
+ if isinstance(message, re.Pattern):
+ message = message.pattern
+ if tokens:
+ endswith = tuple(rf"(?#support{id(token)})" for token in tokens)
+ if message.endswith(endswith):
+ continue
+ new_filters.append((action, message, category, module, lineno))
+ if warnings.filters != new_filters:
+ warnings.filters[:] = new_filters
+ warnings._filters_mutated()
diff --git a/Lib/test/support/warnings_helper.py b/Lib/test/support/warnings_helper.py
index de23e6b..a024fbe 100644
--- a/Lib/test/support/warnings_helper.py
+++ b/Lib/test/support/warnings_helper.py
@@ -187,3 +187,13 @@ def save_restore_warnings_filters():
yield
finally:
warnings.filters[:] = old_filters
+
+
+def _warn_about_deprecation():
+ warnings.warn(
+ "This is used in test_support test to ensure"
+ " support.ignore_deprecations_from() works as expected."
+ " You should not be seeing this.",
+ DeprecationWarning,
+ stacklevel=0,
+ )
diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
index b1d3411..11ca0c2 100644
--- a/Lib/test/test_support.py
+++ b/Lib/test/test_support.py
@@ -11,6 +11,8 @@ import tempfile
import textwrap
import time
import unittest
+import warnings
+
from test import support
from test.support import import_helper
from test.support import os_helper
@@ -22,6 +24,33 @@ TESTFN = os_helper.TESTFN
class TestSupport(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ orig_filter_len = len(warnings.filters)
+ cls._warnings_helper_token = support.ignore_deprecations_from(
+ "test.support.warnings_helper", like=".*used in test_support.*"
+ )
+ cls._test_support_token = support.ignore_deprecations_from(
+ "test.test_support", like=".*You should NOT be seeing this.*"
+ )
+ assert len(warnings.filters) == orig_filter_len + 2
+
+ @classmethod
+ def tearDownClass(cls):
+ orig_filter_len = len(warnings.filters)
+ support.clear_ignored_deprecations(
+ cls._warnings_helper_token,
+ cls._test_support_token,
+ )
+ assert len(warnings.filters) == orig_filter_len - 2
+
+ def test_ignored_deprecations_are_silent(self):
+ """Test support.ignore_deprecations_from() silences warnings"""
+ with warnings.catch_warnings(record=True) as warning_objs:
+ warnings_helper._warn_about_deprecation()
+ warnings.warn("You should NOT be seeing this.", DeprecationWarning)
+ messages = [str(w.message) for w in warning_objs]
+ self.assertEqual(len(messages), 0, messages)
def test_import_module(self):
import_helper.import_module("ftplib")
diff --git a/Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst b/Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst
new file mode 100644
index 0000000..41b5c2f
--- /dev/null
+++ b/Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst
@@ -0,0 +1,2 @@
+Add ability to wholesale silence DeprecationWarnings while running the
+regression test suite.