summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_import
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2023-05-05 20:04:55 (GMT)
committerGitHub <noreply@github.com>2023-05-05 20:04:55 (GMT)
commit1c420e138fd828895b6bd3c44ef99156e8796095 (patch)
treefa6b714a49de1ee679c2de50eeb13735a8c69b1a /Lib/test/test_import
parent55671fe04700ccb4e73c8db3dd1e9c031dafe700 (diff)
downloadcpython-1c420e138fd828895b6bd3c44ef99156e8796095.zip
cpython-1c420e138fd828895b6bd3c44ef99156e8796095.tar.gz
cpython-1c420e138fd828895b6bd3c44ef99156e8796095.tar.bz2
gh-104108: Add the Py_mod_multiple_interpreters Module Def Slot (gh-104148)
I'll be adding a value to indicate support for per-interpreter GIL in gh-99114.
Diffstat (limited to 'Lib/test/test_import')
-rw-r--r--Lib/test/test_import/__init__.py82
1 files changed, 61 insertions, 21 deletions
diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py
index 41dfdaa..9211639 100644
--- a/Lib/test/test_import/__init__.py
+++ b/Lib/test/test_import/__init__.py
@@ -1652,26 +1652,44 @@ class SubinterpImportTests(unittest.TestCase):
os.set_blocking(r, False)
return (r, w)
- def import_script(self, name, fd, check_override=None):
+ def import_script(self, name, fd, filename=None, check_override=None):
override_text = ''
if check_override is not None:
override_text = f'''
- import _imp
- _imp._override_multi_interp_extensions_check({check_override})
- '''
- return textwrap.dedent(f'''
- import os, sys
- {override_text}
- try:
- import {name}
- except ImportError as exc:
- text = 'ImportError: ' + str(exc)
- else:
- text = 'okay'
- os.write({fd}, text.encode('utf-8'))
- ''')
+ import _imp
+ _imp._override_multi_interp_extensions_check({check_override})
+ '''
+ if filename:
+ return textwrap.dedent(f'''
+ from importlib.util import spec_from_loader, module_from_spec
+ from importlib.machinery import ExtensionFileLoader
+ import os, sys
+ {override_text}
+ loader = ExtensionFileLoader({name!r}, {filename!r})
+ spec = spec_from_loader({name!r}, loader)
+ try:
+ module = module_from_spec(spec)
+ loader.exec_module(module)
+ except ImportError as exc:
+ text = 'ImportError: ' + str(exc)
+ else:
+ text = 'okay'
+ os.write({fd}, text.encode('utf-8'))
+ ''')
+ else:
+ return textwrap.dedent(f'''
+ import os, sys
+ {override_text}
+ try:
+ import {name}
+ except ImportError as exc:
+ text = 'ImportError: ' + str(exc)
+ else:
+ text = 'okay'
+ os.write({fd}, text.encode('utf-8'))
+ ''')
- def run_here(self, name, *,
+ def run_here(self, name, filename=None, *,
check_singlephase_setting=False,
check_singlephase_override=None,
isolated=False,
@@ -1700,26 +1718,30 @@ class SubinterpImportTests(unittest.TestCase):
)
r, w = self.pipe()
- script = self.import_script(name, w, check_singlephase_override)
+ script = self.import_script(name, w, filename,
+ check_singlephase_override)
ret = run_in_subinterp_with_config(script, **kwargs)
self.assertEqual(ret, 0)
return os.read(r, 100)
- def check_compatible_here(self, name, *, strict=False, isolated=False):
+ def check_compatible_here(self, name, filename=None, *,
+ strict=False,
+ isolated=False,
+ ):
# Verify that the named module may be imported in a subinterpreter.
# (See run_here() for more info.)
- out = self.run_here(name,
+ out = self.run_here(name, filename,
check_singlephase_setting=strict,
isolated=isolated,
)
self.assertEqual(out, b'okay')
- def check_incompatible_here(self, name, *, isolated=False):
+ def check_incompatible_here(self, name, filename=None, *, isolated=False):
# Differences from check_compatible_here():
# * verify that import fails
# * "strict" is always True
- out = self.run_here(name,
+ out = self.run_here(name, filename,
check_singlephase_setting=True,
isolated=isolated,
)
@@ -1820,6 +1842,24 @@ class SubinterpImportTests(unittest.TestCase):
with self.subTest(f'{module}: strict, fresh'):
self.check_compatible_fresh(module, strict=True)
+ @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module")
+ def test_multi_init_extension_non_isolated_compat(self):
+ modname = '_test_non_isolated'
+ filename = _testmultiphase.__file__
+ loader = ExtensionFileLoader(modname, filename)
+ spec = importlib.util.spec_from_loader(modname, loader)
+ module = importlib.util.module_from_spec(spec)
+ loader.exec_module(module)
+ sys.modules[modname] = module
+
+ require_extension(module)
+ with self.subTest(f'{modname}: isolated'):
+ self.check_incompatible_here(modname, filename, isolated=True)
+ with self.subTest(f'{modname}: not isolated'):
+ self.check_incompatible_here(modname, filename, isolated=False)
+ with self.subTest(f'{modname}: not strict'):
+ self.check_compatible_here(modname, filename, strict=False)
+
def test_python_compat(self):
module = 'threading'
require_pure_python(module)