Skip to content

Commit

Permalink
bpo-41003: Fix test_copyreg when numpy is installed (pythonGH-20935) (p…
Browse files Browse the repository at this point in the history
…ythonGH-20945) (pythonGH-20946)

Fix test_copyreg when numpy is installed: test.pickletester now
saves/restores warnings.filters when importing numpy, to ignore
filters installed by numpy.

Add the save_restore_warnings_filters() function to the
test.support.warnings_helper module.

(cherry picked from commit 8362893)
(cherry picked from commit b39d41b)
  • Loading branch information
vstinner authored Jun 17, 2020
1 parent 071bed8 commit 3d974b2
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 13 deletions.
14 changes: 6 additions & 8 deletions Lib/distutils/tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,24 @@
import os
import sys
import unittest
import warnings
from test.support import run_unittest
from test.support import run_unittest, save_restore_warnings_filters


here = os.path.dirname(__file__) or os.curdir


def test_suite():
old_filters = warnings.filters[:]
suite = unittest.TestSuite()
for fn in os.listdir(here):
if fn.startswith("test") and fn.endswith(".py"):
modname = "distutils.tests." + fn[:-3]
__import__(modname)
# bpo-40055: Save/restore warnings filters to leave them unchanged.
# Importing tests imports docutils which imports pkg_resources
# which adds a warnings filter.
with save_restore_warnings_filters():
__import__(modname)
module = sys.modules[modname]
suite.addTest(module.test_suite())
# bpo-40055: Save/restore warnings filters to leave them unchanged.
# Importing tests imports docutils which imports pkg_resources which adds a
# warnings filter.
warnings.filters[:] = old_filters
return suite


Expand Down
16 changes: 11 additions & 5 deletions Lib/test/pickletester.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,25 @@
except ImportError:
_testbuffer = None

try:
import numpy as np
except ImportError:
np = None

from test import support
from test.support import (
TestFailed, TESTFN, run_with_locale, no_tracing,
_2G, _4G, bigmemtest, reap_threads, forget,
save_restore_warnings_filters
)

from pickle import bytes_types


# bpo-41003: Save/restore warnings filters to leave them unchanged.
# Ignore filters installed by numpy.
try:
with save_restore_warnings_filters():
import numpy as np
except ImportError:
np = None


requires_32b = unittest.skipUnless(sys.maxsize < 2**32,
"test is only meaningful on 32-bit builds")

Expand Down
9 changes: 9 additions & 0 deletions Lib/test/support/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3368,3 +3368,12 @@ def __exit__(self, *exc_info):
del self.exc_value
del self.exc_traceback
del self.thread


@contextlib.contextmanager
def save_restore_warnings_filters():
old_filters = warnings.filters[:]
try:
yield
finally:
warnings.filters[:] = old_filters
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix ``test_copyreg`` when ``numpy`` is installed: ``test.pickletester`` now
saves/restores warnings filters when importing ``numpy``, to ignore filters
installed by ``numpy``.

0 comments on commit 3d974b2

Please sign in to comment.