From 39c17ec368c1952256ede9b620cdad1b7383a419 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 20 Jan 2022 17:45:11 +0100 Subject: [PATCH] bpo-40280: Misc fixes for wasm32-emscripten --- Lib/test/test___all__.py | 17 +++++++++++++++++ Lib/test/test_capi.py | 6 ++++++ Lib/test/test_compileall.py | 4 ++-- Lib/test/test_imp.py | 2 +- Lib/test/test_pty.py | 3 ++- Lib/test/test_tracemalloc.py | 2 +- Tools/wasm/config.site-wasm32-emscripten | 2 ++ configure | 2 +- configure.ac | 2 ++ 9 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py index 15f42d2d114a68..81293e15f8163e 100644 --- a/Lib/test/test___all__.py +++ b/Lib/test/test___all__.py @@ -3,6 +3,12 @@ from test.support import warnings_helper import os import sys +import types + +try: + import _multiprocessing +except ModuleNotFoundError: + _multiprocessing = None class NoAll(RuntimeError): @@ -14,6 +20,17 @@ class FailedImport(RuntimeError): class AllTest(unittest.TestCase): + def setUp(self): + # concurrent.futures uses a __getattr__ hook. Its __all__ triggers + # import of a submodule, which fails when _multiprocessing is not + # available. + if _multiprocessing is None: + sys.modules["_multiprocessing"] = types.ModuleType("_multiprocessing") + + def tearDown(self): + if _multiprocessing is None: + sys.modules.pop("_multiprocessing") + def check_all(self, modname): names = {} with warnings_helper.check_warnings( diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 7ada8406a35849..0957f3253d7a66 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -26,6 +26,10 @@ import _posixsubprocess except ImportError: _posixsubprocess = None +try: + import _testmultiphase +except ImportError: + _testmultiphase = None # Skip this test if the _testcapi module isn't available. _testcapi = import_helper.import_module('_testcapi') @@ -798,6 +802,7 @@ def test_mutate_exception(self): self.assertFalse(hasattr(binascii.Error, "foobar")) + @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") def test_module_state_shared_in_global(self): """ bpo-44050: Extension module state should be shared between interpreters @@ -991,6 +996,7 @@ class PyMemDefaultTests(PyMemDebugTests): PYTHONMALLOC = '' +@unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") class Test_ModuleStateAccess(unittest.TestCase): """Test access to module start (PEP 573)""" diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index 33f0c939325f53..e207cf8f1793b6 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -15,14 +15,14 @@ import unittest from unittest import mock, skipUnless -from concurrent.futures import ProcessPoolExecutor try: # compileall relies on ProcessPoolExecutor if ProcessPoolExecutor exists # and it can function. + from concurrent.futures import ProcessPoolExecutor from concurrent.futures.process import _check_system_limits _check_system_limits() _have_multiprocessing = True -except NotImplementedError: +except (NotImplementedError, ModuleNotFoundError): _have_multiprocessing = False from test import support diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py index 1a21025fe6eaff..35e9a2a186552f 100644 --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -23,7 +23,7 @@ def requires_load_dynamic(meth): """Decorator to skip a test if not running under CPython or lacking imp.load_dynamic().""" meth = support.cpython_only(meth) - return unittest.skipIf(not hasattr(imp, 'load_dynamic'), + return unittest.skipIf(getattr(imp, 'load_dynamic', None) is None, 'imp.load_dynamic() required')(meth) diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index 0c178127571b07..0781cde1e1582e 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -1,8 +1,9 @@ from test.support import verbose, reap_children from test.support.import_helper import import_module -# Skip these tests if termios is not available +# Skip these tests if termios or fcntl are not available import_module('termios') +import_module("fcntl") import errno import os diff --git a/Lib/test/test_tracemalloc.py b/Lib/test/test_tracemalloc.py index 82be98dfd8f5ac..d2a5ede61e3ff1 100644 --- a/Lib/test/test_tracemalloc.py +++ b/Lib/test/test_tracemalloc.py @@ -346,7 +346,7 @@ def fork_child(self): # everything is fine return 0 - @unittest.skipUnless(hasattr(os, 'fork'), 'need os.fork()') + @support.requires_fork() def test_fork(self): # check that tracemalloc is still working after fork pid = os.fork() diff --git a/Tools/wasm/config.site-wasm32-emscripten b/Tools/wasm/config.site-wasm32-emscripten index c15e4fc6b64b11..413506bbc9abd7 100644 --- a/Tools/wasm/config.site-wasm32-emscripten +++ b/Tools/wasm/config.site-wasm32-emscripten @@ -58,12 +58,14 @@ ac_cv_func_fchmodat=no ac_cv_func_dup3=no # Syscalls not implemented in emscripten +# [Errno 52] Function not implemented ac_cv_func_preadv2=no ac_cv_func_preadv=no ac_cv_func_pwritev2=no ac_cv_func_pwritev=no ac_cv_func_pipe2=no ac_cv_func_nice=no +ac_cv_func_setitimer=no # Syscalls that resulted in a segfault ac_cv_func_utimensat=no diff --git a/configure b/configure index 7236e0930e15bb..402e626b6992d1 100755 --- a/configure +++ b/configure @@ -21323,7 +21323,7 @@ case $ac_sys_system/$ac_sys_emscripten_target in #( ;; #( Emscripten/node) : - py_stdlib_not_available="_ctypes _curses _curses_panel _dbm _gdbm _scproxy _tkinter nis ossaudiodev spwd syslog" + py_stdlib_not_available="_ctypes _curses _curses_panel _dbm _gdbm _scproxy _tkinter _xxsubinterpreters grp nis ossaudiodev spwd syslog" ;; #( *) : py_stdlib_not_available="_scproxy" diff --git a/configure.ac b/configure.ac index aea12128c1217d..9c9a3385767360 100644 --- a/configure.ac +++ b/configure.ac @@ -6384,6 +6384,8 @@ AS_CASE([$ac_sys_system/$ac_sys_emscripten_target], _gdbm _scproxy _tkinter + _xxsubinterpreters + grp nis ossaudiodev spwd