diff options
author | Christian Heimes <christian@python.org> | 2022-03-22 10:04:36 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-22 10:04:36 (GMT) |
commit | deeaac49e267285158264643799624623f4a7b29 (patch) | |
tree | 27f409d7d43cf169451aa892a2363f1cac85f7df /Lib | |
parent | a25a985535ccbb7df8caddc0017550ff4eae5855 (diff) | |
download | cpython-deeaac49e267285158264643799624623f4a7b29.zip cpython-deeaac49e267285158264643799624623f4a7b29.tar.gz cpython-deeaac49e267285158264643799624623f4a7b29.tar.bz2 |
bpo-40280: Skip socket, fork, subprocess tests on Emscripten (GH-31986)
- Add requires_fork and requires_subprocess to more tests
- Skip extension import tests if dlopen is not available
- Don't assume that _testcapi is a shared extension
- Skip a lot of socket tests that don't work on Emscripten
- Skip mmap tests, mmap emulation is incomplete
- venv does not work yet
- Cannot get libc from executable
The "entire" test suite is now passing on Emscripten with EMSDK from git head (91 suites are skipped).
Diffstat (limited to 'Lib')
47 files changed, 151 insertions, 18 deletions
diff --git a/Lib/test/lock_tests.py b/Lib/test/lock_tests.py index d826293..f16c7ed 100644 --- a/Lib/test/lock_tests.py +++ b/Lib/test/lock_tests.py @@ -15,7 +15,7 @@ from test import support from test.support import threading_helper -requires_fork = unittest.skipUnless(hasattr(os, 'fork'), +requires_fork = unittest.skipUnless(support.has_fork_support, "platform doesn't support fork " "(no _at_fork_reinit method)") diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py index d15a11c..b00830c 100644 --- a/Lib/test/pythoninfo.py +++ b/Lib/test/pythoninfo.py @@ -6,6 +6,7 @@ import errno import re import sys import traceback +import unittest import warnings @@ -615,7 +616,7 @@ def collect_resource(info_add): def collect_test_socket(info_add): try: from test import test_socket - except ImportError: + except (ImportError, unittest.SkipTest): return # all check attributes like HAVE_SOCKET_CAN diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index fc1b86b..c5666d6 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -42,6 +42,7 @@ __all__ = [ "requires_IEEE_754", "requires_zlib", "has_fork_support", "requires_fork", "has_subprocess_support", "requires_subprocess", + "has_socket_support", "requires_working_socket", "anticipate_failure", "load_package_tests", "detect_api_mismatch", "check__all__", "skip_if_buggy_ucrt_strfptime", "check_disallow_instantiation", "check_sanitizer", "skip_if_sanitizer", @@ -520,6 +521,21 @@ def requires_subprocess(): """Used for subprocess, os.spawn calls, fd inheritance""" return unittest.skipUnless(has_subprocess_support, "requires subprocess support") +# Emscripten's socket emulation has limitation. WASI doesn't have sockets yet. +has_socket_support = not is_emscripten and not is_wasi + +def requires_working_socket(*, module=False): + """Skip tests or modules that require working sockets + + Can be used as a function/class decorator or to skip an entire module. + """ + msg = "requires socket support" + if module: + if not has_socket_support: + raise unittest.SkipTest(msg) + else: + return unittest.skipUnless(has_socket_support, msg) + # Does strftime() support glibc extension like '%4Y'? has_strftime_extensions = False if sys.platform != "win32": diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index 473bce4..fb22f41 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -4,10 +4,12 @@ import unittest import contextlib from test.support.import_helper import import_module -from test.support import gc_collect +from test.support import gc_collect, requires_working_socket asyncio = import_module("asyncio") +requires_working_socket(module=True) + _no_default = object() diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py index 973ac1f..d28d677 100644 --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -18,6 +18,8 @@ with warnings.catch_warnings(): import asynchat import asyncore +support.requires_working_socket(module=True) + HOST = socket_helper.HOST SERVER_QUIT = b'QUIT\n' diff --git a/Lib/test/test_asyncio/__init__.py b/Lib/test/test_asyncio/__init__.py index 5d41504..ab0b5aa 100644 --- a/Lib/test/test_asyncio/__init__.py +++ b/Lib/test/test_asyncio/__init__.py @@ -1,7 +1,9 @@ import os +from test import support from test.support import load_package_tests from test.support import import_helper +support.requires_working_socket(module=True) # Skip tests if we don't have concurrent.futures. import_helper.import_module('concurrent.futures') diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index ecd1e12..e3f31bd 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -18,6 +18,8 @@ from io import BytesIO if support.PGO: raise unittest.SkipTest("test is not helpful for PGO") +support.requires_working_socket(module=True) + import warnings with warnings.catch_warnings(): warnings.simplefilter('ignore', DeprecationWarning) diff --git a/Lib/test/test_contextlib_async.py b/Lib/test/test_contextlib_async.py index c16c7ec..462e05c 100644 --- a/Lib/test/test_contextlib_async.py +++ b/Lib/test/test_contextlib_async.py @@ -8,6 +8,7 @@ import unittest from test.test_contextlib import TestBaseExitStack +support.requires_working_socket(module=True) def _async_test(func): """Decorator to turn an async function into a test case.""" diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 407a14c..8616aed 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -18,6 +18,11 @@ import shutil import types import contextlib + +if not support.has_subprocess_support: + raise unittest.SkipTest("test_CLI requires subprocess support.") + + # NOTE: There are some additional tests relating to interaction with # zipimport in the test_zipimport_support test module. @@ -455,7 +460,7 @@ We'll simulate a __file__ attr that ends in pyc: >>> tests = finder.find(sample_func) >>> print(tests) # doctest: +ELLIPSIS - [<DocTest sample_func from test_doctest.py:28 (1 example)>] + [<DocTest sample_func from test_doctest.py:33 (1 example)>] The exact name depends on how test_doctest was invoked, so allow for leading path components. diff --git a/Lib/test/test_docxmlrpc.py b/Lib/test/test_docxmlrpc.py index 9a06be4..89d8009 100644 --- a/Lib/test/test_docxmlrpc.py +++ b/Lib/test/test_docxmlrpc.py @@ -4,6 +4,9 @@ import re import sys import threading import unittest +from test import support + +support.requires_working_socket(module=True) def make_request_and_skipIf(condition, reason): # If we skip the test, we have to make a request because diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 2f5cc06..2794fcc 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -29,6 +29,7 @@ with warnings.catch_warnings(): import asyncore import asynchat +support.requires_working_socket(module=True) TIMEOUT = support.LOOPBACK_TIMEOUT DEFAULT_ENCODING = 'utf-8' diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 8265b8d..15dab03 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -19,6 +19,7 @@ from test.support import os_helper from test.support import socket_helper from test.support import warnings_helper +support.requires_working_socket(module=True) here = os.path.dirname(__file__) # Self-signed cert file for 'localhost' diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 1cc020f..d20b45e 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -33,6 +33,7 @@ from test import support from test.support import os_helper from test.support import threading_helper +support.requires_working_socket(module=True) class NoLogRequestHandler: def log_message(self, *args): diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 30b5537..ff13ede 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -11,7 +11,8 @@ import threading import socket from test.support import (verbose, - run_with_tz, run_with_locale, cpython_only) + run_with_tz, run_with_locale, cpython_only, + requires_working_socket) from test.support import hashlib_helper from test.support import threading_helper from test.support import warnings_helper @@ -23,6 +24,8 @@ try: except ImportError: ssl = None +support.requires_working_socket(module=True) + CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "keycert3.pem") CAFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "pycacert.pem") diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 8857fd5..7cca9f9 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -20,7 +20,7 @@ from unittest import mock from test.support import os_helper from test.support import ( - STDLIB_DIR, is_jython, swap_attr, swap_item, cpython_only) + STDLIB_DIR, is_jython, swap_attr, swap_item, cpython_only, is_emscripten) from test.support.import_helper import ( forget, make_legacy_pyc, unlink, unload, DirsOnSysPath, CleanImport) from test.support.os_helper import ( @@ -101,8 +101,17 @@ class ImportTests(unittest.TestCase): with self.assertRaises(ImportError) as cm: from _testcapi import i_dont_exist self.assertEqual(cm.exception.name, '_testcapi') - self.assertEqual(cm.exception.path, _testcapi.__file__) - self.assertRegex(str(cm.exception), r"cannot import name 'i_dont_exist' from '_testcapi' \(.*\.(so|pyd)\)") + if hasattr(_testcapi, "__file__"): + self.assertEqual(cm.exception.path, _testcapi.__file__) + self.assertRegex( + str(cm.exception), + r"cannot import name 'i_dont_exist' from '_testcapi' \(.*\.(so|pyd)\)" + ) + else: + self.assertEqual( + str(cm.exception), + "cannot import name 'i_dont_exist' from '_testcapi' (unknown location)" + ) def test_from_import_missing_attr_has_name(self): with self.assertRaises(ImportError) as cm: @@ -525,6 +534,7 @@ class FilePermissionTests(unittest.TestCase): @unittest.skipUnless(os.name == 'posix', "test meaningful only on posix systems") + @unittest.skipIf(is_emscripten, "Emscripten's umask is a stub.") def test_creation_mode(self): mask = 0o022 with temp_umask(mask), _ready_to_import() as (name, path): diff --git a/Lib/test/test_importlib/extension/test_finder.py b/Lib/test/test_importlib/extension/test_finder.py index 140f206..b6663a4 100644 --- a/Lib/test/test_importlib/extension/test_finder.py +++ b/Lib/test/test_importlib/extension/test_finder.py @@ -10,6 +10,10 @@ class FinderTests(abc.FinderTests): """Test the finder for extension modules.""" + def setUp(self): + if not self.machinery.EXTENSION_SUFFIXES: + raise unittest.SkipTest("Requires dynamic loading support.") + def find_spec(self, fullname): importer = self.machinery.FileFinder(util.EXTENSIONS.path, (self.machinery.ExtensionFileLoader, diff --git a/Lib/test/test_importlib/extension/test_loader.py b/Lib/test/test_importlib/extension/test_loader.py index e7a88a8..5080009 100644 --- a/Lib/test/test_importlib/extension/test_loader.py +++ b/Lib/test/test_importlib/extension/test_loader.py @@ -12,11 +12,14 @@ import importlib.util import importlib from test.support.script_helper import assert_python_failure + class LoaderTests(abc.LoaderTests): """Test load_module() for extension modules.""" def setUp(self): + if not self.machinery.EXTENSION_SUFFIXES: + raise unittest.SkipTest("Requires dynamic loading support.") self.loader = self.machinery.ExtensionFileLoader(util.EXTENSIONS.name, util.EXTENSIONS.file_path) @@ -91,6 +94,8 @@ class MultiPhaseExtensionModuleTests(abc.LoaderTests): # Test loading extension modules with multi-phase initialization (PEP 489). def setUp(self): + if not self.machinery.EXTENSION_SUFFIXES: + raise unittest.SkipTest("Requires dynamic loading support.") self.name = '_testmultiphase' finder = self.machinery.FileFinder(None) self.spec = importlib.util.find_spec(self.name) diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 1d7fca6..2b63810 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -10,6 +10,7 @@ from test.support import os_helper from test.support.script_helper import assert_python_ok +@support.requires_subprocess() class TestTool(unittest.TestCase): data = """ diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index be193dc..5f72a6d 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -75,6 +75,7 @@ try: except ImportError: pass + class BaseTest(unittest.TestCase): """Base class for logging tests.""" @@ -626,6 +627,9 @@ class HandlerTest(BaseTest): os.unlink(fn) @unittest.skipIf(os.name == 'nt', 'WatchedFileHandler not appropriate for Windows.') + @unittest.skipIf( + support.is_emscripten, "Emscripten cannot fstat unlinked files." + ) def test_race(self): # Issue #14632 refers. def remove_loop(fname, tries): @@ -1058,6 +1062,7 @@ if hasattr(socket, "AF_UNIX"): # - end of server_helper section +@support.requires_working_socket() class SMTPHandlerTest(BaseTest): # bpo-14314, bpo-19665, bpo-34092: don't wait forever TIMEOUT = support.LONG_TIMEOUT @@ -1681,6 +1686,7 @@ class ConfigFileTest(BaseTest): os.unlink(fn) +@support.requires_working_socket() class SocketHandlerTest(BaseTest): """Test for SocketHandler objects.""" @@ -1795,6 +1801,7 @@ class UnixSocketHandlerTest(SocketHandlerTest): SocketHandlerTest.tearDown(self) os_helper.unlink(self.address) +@support.requires_working_socket() class DatagramHandlerTest(BaseTest): """Test for DatagramHandler.""" @@ -1876,6 +1883,7 @@ class UnixDatagramHandlerTest(DatagramHandlerTest): DatagramHandlerTest.tearDown(self) os_helper.unlink(self.address) +@support.requires_working_socket() class SysLogHandlerTest(BaseTest): """Test for SysLogHandler using UDP.""" @@ -1985,6 +1993,7 @@ class IPv6SysLogHandlerTest(SysLogHandlerTest): self.server_class.address_family = socket.AF_INET super(IPv6SysLogHandlerTest, self).tearDown() +@support.requires_working_socket() class HTTPHandlerTest(BaseTest): """Test for HTTPHandler.""" @@ -3261,6 +3270,7 @@ class ConfigDictTest(BaseTest): logging.config.stopListening() threading_helper.join_thread(t) + @support.requires_working_socket() def test_listen_config_10_ok(self): with support.captured_stdout() as output: self.setup_via_listener(json.dumps(self.config10)) @@ -3280,6 +3290,7 @@ class ConfigDictTest(BaseTest): ('ERROR', '4'), ], stream=output) + @support.requires_working_socket() def test_listen_config_1_ok(self): with support.captured_stdout() as output: self.setup_via_listener(textwrap.dedent(ConfigFileTest.config1)) @@ -3294,6 +3305,7 @@ class ConfigDictTest(BaseTest): # Original logger output is empty. self.assert_log_lines([]) + @support.requires_working_socket() def test_listen_verify(self): def verify_fail(stuff): diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index 604fc45..20c460e 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -1061,7 +1061,7 @@ class _TestMboxMMDF(_TestSingleFile): self.assertEqual(contents, f.read()) self._box = self._factory(self._path) - @unittest.skipUnless(hasattr(os, 'fork'), "Test needs fork().") + @support.requires_fork() @unittest.skipUnless(hasattr(socket, 'socketpair'), "Test needs socketpair().") def test_lock_conflict(self): # Fork off a child process that will lock the mailbox temporarily, diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 014171c..213a44d 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -1,4 +1,6 @@ -from test.support import (requires, _2G, _4G, gc_collect, cpython_only) +from test.support import ( + requires, _2G, _4G, gc_collect, cpython_only, is_emscripten +) from test.support.import_helper import import_module from test.support.os_helper import TESTFN, unlink import unittest @@ -21,6 +23,12 @@ def random_tagname(length=10): suffix = ''.join(random.choices(string.ascii_uppercase, k=length)) return f'{tagname_prefix}_{suffix}' +# Python's mmap module dup()s the file descriptor. Emscripten's FS layer +# does not materialize file changes through a dupped fd to a new mmap. +if is_emscripten: + raise unittest.SkipTest("incompatible with Emscripten's mmap emulation.") + + class MmapTests(unittest.TestCase): def setUp(self): diff --git a/Lib/test/test_pdb.py b/Lib/test/test_pdb.py index d2bf3dc..bfa2cc9 100644 --- a/Lib/test/test_pdb.py +++ b/Lib/test/test_pdb.py @@ -13,6 +13,7 @@ import linecache from contextlib import ExitStack, redirect_stdout from io import StringIO +from test import support from test.support import os_helper # This little helper class is essential for testing pdb under doctest. from test.test_doctest import _FakeInput @@ -1363,6 +1364,7 @@ def test_pdb_issue_43318(): """ +@support.requires_subprocess() class PdbTestCase(unittest.TestCase): def tearDown(self): os_helper.unlink(os_helper.TESTFN) diff --git a/Lib/test/test_peg_generator/test_c_parser.py b/Lib/test/test_peg_generator/test_c_parser.py index b761bd4..51a4f7d 100644 --- a/Lib/test/test_peg_generator/test_c_parser.py +++ b/Lib/test/test_peg_generator/test_c_parser.py @@ -70,6 +70,7 @@ unittest.main() """ +@support.requires_subprocess() class TestCParser(unittest.TestCase): def setUp(self): self._backup_config_vars = dict(sysconfig._CONFIG_VARS) diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index d70ef15..9b2cd20 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -364,6 +364,7 @@ class PlatformTest(unittest.TestCase): # parent support.wait_process(pid, exitcode=0) + @unittest.skipIf(support.is_emscripten, "Does not apply to Emscripten") def test_libc_ver(self): # check that libc_ver(executable) doesn't raise an exception if os.path.isdir(sys.executable) and \ diff --git a/Lib/test/test_poll.py b/Lib/test/test_poll.py index ae3ffc7..7d542b5 100644 --- a/Lib/test/test_poll.py +++ b/Lib/test/test_poll.py @@ -7,7 +7,9 @@ import select import threading import time import unittest -from test.support import cpython_only, requires_subprocess +from test.support import ( + cpython_only, requires_subprocess, requires_working_socket +) from test.support import threading_helper from test.support.os_helper import TESTFN @@ -17,6 +19,7 @@ try: except AttributeError: raise unittest.SkipTest("select.poll not defined") +requires_working_socket(module=True) def find_ready_matching(ready, flag): match = [] diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py index 1220ca3..57ccc54 100644 --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -22,6 +22,8 @@ with warnings.catch_warnings(): import asynchat import asyncore +test_support.requires_working_socket(module=True) + HOST = socket_helper.HOST PORT = 0 diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 7cedf76..e2dab12 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -27,7 +27,7 @@ from test.support import os_helper from test.support.script_helper import assert_python_ok, assert_python_failure from test.support import threading_helper from test.support import (reap_children, captured_output, captured_stdout, - captured_stderr, requires_docstrings) + captured_stderr, is_emscripten, requires_docstrings) from test.support.os_helper import (TESTFN, rmtree, unlink) from test import pydoc_mod @@ -1339,6 +1339,7 @@ foo ) +@unittest.skipIf(is_emscripten, "Socket server not available on Emscripten.") class PydocServerTest(unittest.TestCase): """Tests for pydoc._start_server""" diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py index b0bed43..08bdf59 100644 --- a/Lib/test/test_robotparser.py +++ b/Lib/test/test_robotparser.py @@ -308,6 +308,9 @@ class RobotHandler(BaseHTTPRequestHandler): pass +@unittest.skipIf( + support.is_emscripten, "Socket server not available on Emscripten." +) class PasswordProtectedSiteTestCase(unittest.TestCase): def setUp(self): diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py index 8b59321..ca2a9d9 100644 --- a/Lib/test/test_select.py +++ b/Lib/test/test_select.py @@ -7,6 +7,8 @@ import textwrap import unittest from test import support +support.requires_working_socket(module=True) + @unittest.skipIf((sys.platform[:3]=='win'), "can't easily test on this system") class SelectTestCase(unittest.TestCase): diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py index fe6b725..c927331 100644 --- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -19,6 +19,10 @@ except ImportError: resource = None +if support.is_emscripten: + raise unittest.SkipTest("Cannot create socketpair on Emscripten.") + + if hasattr(socket, 'socketpair'): socketpair = socket.socketpair else: diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index 1a60fef..e798645 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -29,6 +29,8 @@ with warnings.catch_warnings(): import asyncore import smtpd +support.requires_working_socket(module=True) + HOST = socket_helper.HOST if sys.platform == 'darwin': diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 53aa5e9..97cc626 100755 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -37,6 +37,8 @@ try: except ImportError: fcntl = None +support.requires_working_socket(module=True) + HOST = socket_helper.HOST # test unicode string and carriage return MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index 211321f..c498d3d 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -28,7 +28,7 @@ HOST = socket_helper.HOST HAVE_UNIX_SOCKETS = hasattr(socket, "AF_UNIX") requires_unix_sockets = unittest.skipUnless(HAVE_UNIX_SOCKETS, 'requires Unix sockets') -HAVE_FORKING = hasattr(os, "fork") +HAVE_FORKING = test.support.has_fork_support requires_forking = unittest.skipUnless(HAVE_FORKING, 'requires forking') def signal_alarm(n): diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index fe6f7da..85d6bdf 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -8,6 +8,7 @@ import gc from functools import wraps import asyncio +support.requires_working_socket(module=True) class tracecontext: """Context manager that traces its enter and exit.""" diff --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py index 41c4fcd..b50df14 100644 --- a/Lib/test/test_telnetlib.py +++ b/Lib/test/test_telnetlib.py @@ -8,6 +8,8 @@ from test import support from test.support import socket_helper import unittest +support.requires_working_socket(module=True) + HOST = socket_helper.HOST def server(evt, serv): diff --git a/Lib/test/test_tools/__init__.py b/Lib/test/test_tools/__init__.py index 34b0d3b..2102b9f 100644 --- a/Lib/test/test_tools/__init__.py +++ b/Lib/test/test_tools/__init__.py @@ -13,6 +13,10 @@ if support.check_sanitizer(address=True, memory=True): raise unittest.SkipTest("test too slow on ASAN/MSAN build") +if not support.has_subprocess_support: + raise unittest.SkipTest("test module requires subprocess") + + basepath = os.path.normpath( os.path.dirname( # <src/install dir> os.path.dirname( # Lib diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index a4772a5..46a0ab1 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -24,6 +24,8 @@ from urllib.parse import urlparse import urllib.error import http.client +support.requires_working_socket(module=True) + # XXX # Request # CacheFTPHandler (hard to write) diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py index 1b2baf2..3631431 100644 --- a/Lib/test/test_urllib2_localnet.py +++ b/Lib/test/test_urllib2_localnet.py @@ -8,6 +8,7 @@ import threading import unittest import hashlib +from test import support from test.support import hashlib_helper from test.support import threading_helper from test.support import warnings_helper @@ -17,6 +18,8 @@ try: except ImportError: ssl = None +support.requires_working_socket(module=True) + here = os.path.dirname(__file__) # Self-signed cert file for 'localhost' CERT_localhost = os.path.join(here, 'keycert.pem') diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index db812f2..c91b754 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -16,7 +16,7 @@ import sys import tempfile from test.support import (captured_stdout, captured_stderr, requires_zlib, skip_if_broken_multiprocessing_synchronize, verbose, - requires_subprocess) + requires_subprocess, is_emscripten) from test.support.os_helper import (can_symlink, EnvironmentVarGuard, rmtree) import unittest import venv @@ -34,6 +34,9 @@ requireVenvCreate = unittest.skipUnless( or sys._base_executable != sys.executable, 'cannot run venv.create from within a venv on this platform') +if is_emscripten: + raise unittest.SkipTest("venv is not available on Emscripten.") + @requires_subprocess() def check_output(cmd, encoding=None): p = subprocess.Popen(cmd, diff --git a/Lib/test/test_wait3.py b/Lib/test/test_wait3.py index aa166ba..4ec7690 100644 --- a/Lib/test/test_wait3.py +++ b/Lib/test/test_wait3.py @@ -9,8 +9,8 @@ import unittest from test.fork_wait import ForkWait from test import support -if not hasattr(os, 'fork'): - raise unittest.SkipTest("os.fork not defined") +if not support.has_fork_support: + raise unittest.SkipTest("requires working os.fork()") if not hasattr(os, 'wait3'): raise unittest.SkipTest("os.wait3 not defined") diff --git a/Lib/test/test_wait4.py b/Lib/test/test_wait4.py index f8d5e13..24f1aae 100644 --- a/Lib/test/test_wait4.py +++ b/Lib/test/test_wait4.py @@ -9,7 +9,9 @@ from test.fork_wait import ForkWait from test import support # If either of these do not exist, skip this test. -support.get_attribute(os, 'fork') +if not support.has_fork_support: + raise unittest.SkipTest("requires working os.fork()") + support.get_attribute(os, 'wait4') diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 1f06f5f..6c4601d 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -25,6 +25,8 @@ try: except ImportError: gzip = None +support.requires_working_socket(module=True) + alist = [{'astring': 'foo@bar.baz.spam', 'afloat': 7283.43, 'anint': 2**20, diff --git a/Lib/unittest/test/__init__.py b/Lib/unittest/test/__init__.py index cdae8a7..143f4ab 100644 --- a/Lib/unittest/test/__init__.py +++ b/Lib/unittest/test/__init__.py @@ -11,7 +11,10 @@ def suite(): for fn in os.listdir(here): if fn.startswith("test") and fn.endswith(".py"): modname = "unittest.test." + fn[:-3] - __import__(modname) + try: + __import__(modname) + except unittest.SkipTest: + continue module = sys.modules[modname] suite.addTest(loader.loadTestsFromModule(module)) suite.addTest(loader.loadTestsFromName('unittest.test.testmock')) diff --git a/Lib/unittest/test/test_async_case.py b/Lib/unittest/test/test_async_case.py index 7dc8a6b..a481408 100644 --- a/Lib/unittest/test/test_async_case.py +++ b/Lib/unittest/test/test_async_case.py @@ -3,6 +3,8 @@ import contextvars import unittest from test import support +support.requires_working_socket(module=True) + class MyException(Exception): pass diff --git a/Lib/unittest/test/test_program.py b/Lib/unittest/test/test_program.py index fa9e629..126497a 100644 --- a/Lib/unittest/test/test_program.py +++ b/Lib/unittest/test/test_program.py @@ -196,6 +196,7 @@ class FakeRunner(object): return RESULT +@support.requires_subprocess() class TestCommandLineArgs(unittest.TestCase): def setUp(self): diff --git a/Lib/unittest/test/test_runner.py b/Lib/unittest/test/test_runner.py index c487e9e..18062ae 100644 --- a/Lib/unittest/test/test_runner.py +++ b/Lib/unittest/test/test_runner.py @@ -3,6 +3,7 @@ import os import sys import pickle import subprocess +from test import support import unittest from unittest.case import _Outcome @@ -1139,6 +1140,7 @@ class Test_TextTestRunner(unittest.TestCase): expectedresult = (runner.stream, DESCRIPTIONS, VERBOSITY) self.assertEqual(runner._makeResult(), expectedresult) + @support.requires_subprocess() def test_warnings(self): """ Check that warnings argument of TextTestRunner correctly affects the diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py index 122e695..1bab671 100644 --- a/Lib/unittest/test/testmock/testasync.py +++ b/Lib/unittest/test/testmock/testasync.py @@ -4,6 +4,9 @@ import inspect import re import unittest from contextlib import contextmanager +from test import support + +support.requires_working_socket(module=True) from asyncio import run, iscoroutinefunction from unittest import IsolatedAsyncioTestCase |