summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xLib/test/regrtest.py2
-rw-r--r--Lib/test/support.py26
-rw-r--r--Lib/test/test_asynchat.py9
-rw-r--r--Lib/test/test_bz2.py4
-rwxr-xr-xLib/test/test_crypt.py3
-rw-r--r--Lib/test/test_ctypes.py6
-rw-r--r--Lib/test/test_curses.py9
-rw-r--r--Lib/test/test_dbm.py4
-rwxr-xr-xLib/test/test_fcntl.py7
-rw-r--r--Lib/test/test_fork1.py10
-rwxr-xr-xLib/test/test_grp.py3
-rw-r--r--Lib/test/test_ioctl.py11
-rw-r--r--Lib/test/test_mmap.py6
-rw-r--r--Lib/test/test_multiprocessing.py11
-rw-r--r--Lib/test/test_nis.py4
-rw-r--r--Lib/test/test_ossaudiodev.py3
-rw-r--r--Lib/test/test_posix.py8
-rw-r--r--Lib/test/test_pwd.py2
-rw-r--r--Lib/test/test_resource.py4
-rw-r--r--Lib/test/test_sqlite.py9
-rw-r--r--Lib/test/test_startfile.py6
-rw-r--r--Lib/test/test_tcl.py5
-rw-r--r--Lib/test/test_tk.py5
-rw-r--r--Lib/test/test_ttk_guionly.py10
-rw-r--r--Lib/test/test_ttk_textonly.py4
-rw-r--r--Lib/test/test_winreg.py7
-rw-r--r--Lib/test/test_winsound.py4
-rw-r--r--Lib/test/test_xml_etree_c.py2
-rw-r--r--Lib/test/test_zlib.py3
-rw-r--r--Misc/NEWS4
30 files changed, 124 insertions, 67 deletions
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index dae7442..edfaa9a 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -628,7 +628,7 @@ def runtest_inner(test, generate, verbose, quiet, test_times,
print(test, "skipped --", msg)
sys.stdout.flush()
return -2
- except (ImportError, unittest.SkipTest) as msg:
+ except unittest.SkipTest as msg:
if not quiet:
print(test, "skipped --", msg)
sys.stdout.flush()
diff --git a/Lib/test/support.py b/Lib/test/support.py
index e209170..9cd50a0 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -12,6 +12,7 @@ import platform
import shutil
import warnings
import unittest
+import importlib
__all__ = ["Error", "TestFailed", "ResourceDenied", "import_module",
"verbose", "use_resources", "max_memuse", "record_original_stdout",
@@ -24,7 +25,7 @@ __all__ = ["Error", "TestFailed", "ResourceDenied", "import_module",
"TransientResource", "transient_internet", "run_with_locale",
"set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
"run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
- "reap_children", "cpython_only", "check_impl_detail"]
+ "reap_children", "cpython_only", "check_impl_detail", "get_attribute"]
class Error(Exception):
"""Base class for regression test exceptions."""
@@ -41,19 +42,32 @@ class ResourceDenied(unittest.SkipTest):
"""
def import_module(name, deprecated=False):
- """Import the module to be tested, raising SkipTest if it is not
- available."""
+ """Import and return the module to be tested, raising SkipTest if
+ it is not available.
+
+ If deprecated is True, any module or package deprecation messages
+ will be suppressed."""
with warnings.catch_warnings():
if deprecated:
warnings.filterwarnings("ignore", ".+ (module|package)",
DeprecationWarning)
try:
- module = __import__(name, level=0)
- except ImportError:
- raise unittest.SkipTest("No module named " + name)
+ module = importlib.import_module(name)
+ except ImportError as msg:
+ raise unittest.SkipTest(str(msg))
else:
return module
+def get_attribute(obj, name):
+ """Get an attribute, raising SkipTest if AttributeError is raised."""
+ try:
+ attribute = getattr(obj, name)
+ except AttributeError:
+ raise unittest.SkipTest("module %s has no attribute %s" % (
+ obj.__name__, name))
+ else:
+ return attribute
+
verbose = 1 # Flag set to 0 by regrtest.py
use_resources = None # Flag set to [] by regrtest.py
max_memuse = 0 # Disable bigmem tests (they will still be run with
diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py
index db0b194..3da5878 100644
--- a/Lib/test/test_asynchat.py
+++ b/Lib/test/test_asynchat.py
@@ -1,10 +1,13 @@
-# test asynchat -- requires threading
+# test asynchat
+
+from test import support
+
+# If this fails, the test will be skipped.
+thread = support.import_module('_thread')
-import _thread as thread # If this fails, we can't test this module
import asyncore, asynchat, socket, threading, time
import unittest
import sys
-from test import support
HOST = support.HOST
SERVER_QUIT = b'QUIT\n'
diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py
index 18d84bb..6715a02 100644
--- a/Lib/test/test_bz2.py
+++ b/Lib/test/test_bz2.py
@@ -8,7 +8,9 @@ import os
import subprocess
import sys
-import bz2
+# Skip tests if the bz2 module doesn't exist.
+bz2 = support.import_module('bz2')
+
from bz2 import BZ2File, BZ2Compressor, BZ2Decompressor
has_cmdline_bunzip2 = sys.platform not in ("win32", "os2emx")
diff --git a/Lib/test/test_crypt.py b/Lib/test/test_crypt.py
index b4d0ac9..2adb28d 100755
--- a/Lib/test/test_crypt.py
+++ b/Lib/test/test_crypt.py
@@ -1,6 +1,7 @@
from test import support
import unittest
-import crypt
+
+crypt = support.import_module('crypt')
class CryptTestCase(unittest.TestCase):
diff --git a/Lib/test/test_ctypes.py b/Lib/test/test_ctypes.py
index 92c98ad..7d9abdc 100644
--- a/Lib/test/test_ctypes.py
+++ b/Lib/test/test_ctypes.py
@@ -1,6 +1,10 @@
import unittest
-from test.support import run_unittest
+from test.support import run_unittest, import_module
+
+# Skip tests if _ctypes module was not built.
+import_module('_ctypes')
+
import ctypes.test
def test_main():
diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py
index ed93946..3f43c11 100644
--- a/Lib/test/test_curses.py
+++ b/Lib/test/test_curses.py
@@ -9,16 +9,19 @@
# Only called, not tested: getmouse(), ungetmouse()
#
-import curses, sys, tempfile, os
-import curses.panel
+import sys, tempfile, os
# Optionally test curses module. This currently requires that the
# 'curses' resource be given on the regrtest command line using the -u
# option. If not available, nothing after this line will be executed.
-from test.support import requires
+from test.support import requires, import_module
requires('curses')
+# If either of these don't exist, skip the tests.
+curses = import_module('curses')
+curses.panel = import_module('curses.panel')
+
# XXX: if newterm was supported we could use it instead of initscr and not exit
term = os.environ.get('TERM')
if not term or term == 'unknown':
diff --git a/Lib/test/test_dbm.py b/Lib/test/test_dbm.py
index cd2ff27..35d12e4 100644
--- a/Lib/test/test_dbm.py
+++ b/Lib/test/test_dbm.py
@@ -3,10 +3,12 @@
import os
import unittest
-import dbm
import glob
import test.support
+# Skip tests if dbm module doesn't exist.
+dbm = test.support.import_module('dbm')
+
_fname = test.support.TESTFN
#
diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py
index afb511c..72748f9 100755
--- a/Lib/test/test_fcntl.py
+++ b/Lib/test/test_fcntl.py
@@ -3,12 +3,15 @@
OS/2+EMX doesn't support the file locking operations.
"""
-import fcntl
import os
import struct
import sys
import unittest
-from test.support import verbose, TESTFN, unlink, run_unittest
+from test.support import verbose, TESTFN, unlink, run_unittest, import_module
+
+# Skip test if no fnctl module.
+fcntl = import_module('fcntl')
+
# TODO - Write tests for flock() and lockf().
diff --git a/Lib/test/test_fork1.py b/Lib/test/test_fork1.py
index c9f18d9..e036661 100644
--- a/Lib/test/test_fork1.py
+++ b/Lib/test/test_fork1.py
@@ -3,14 +3,12 @@
import os
import time
-import unittest
from test.fork_wait import ForkWait
-from test.support import run_unittest, reap_children
+from test.support import run_unittest, reap_children, get_attribute
+
+# Skip test if fork does not exist.
+get_attribute(os, 'fork')
-try:
- os.fork
-except AttributeError:
- raise unittest.SkipTest("os.fork not defined -- skipping test_fork1")
class ForkTest(ForkWait):
def wait_impl(self, cpid):
diff --git a/Lib/test/test_grp.py b/Lib/test/test_grp.py
index 5acda52..1c1f75f 100755
--- a/Lib/test/test_grp.py
+++ b/Lib/test/test_grp.py
@@ -1,9 +1,10 @@
"""Test script for the grp module."""
-import grp
import unittest
from test import support
+grp = support.import_module('grp')
+
class GroupDatabaseTestCase(unittest.TestCase):
def check_value(self, value):
diff --git a/Lib/test/test_ioctl.py b/Lib/test/test_ioctl.py
index f6508c2..dcb6695 100644
--- a/Lib/test/test_ioctl.py
+++ b/Lib/test/test_ioctl.py
@@ -1,12 +1,9 @@
import unittest
-from test.support import run_unittest
+from test.support import run_unittest, import_module, get_attribute
import os, struct
-try:
- import fcntl, termios
-except ImportError:
- raise unittest.SkipTest("No fcntl or termios module")
-if not hasattr(termios,'TIOCGPGRP'):
- raise unittest.SkipTest("termios module doesn't have TIOCGPGRP")
+fcntl = import_module('fcntl')
+termios = import_module('termios')
+get_attribute(termios, 'TIOCGPGRP') #Can't run tests without this feature
try:
tty = open("/dev/tty", "r")
diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py
index a2e9f72..99cc63f 100644
--- a/Lib/test/test_mmap.py
+++ b/Lib/test/test_mmap.py
@@ -1,8 +1,10 @@
-from test.support import TESTFN, run_unittest
-import mmap
+from test.support import TESTFN, run_unittest, import_module
import unittest
import os, re, itertools
+# Skip test if we can't import mmap.
+mmap = import_module('mmap')
+
PAGESIZE = mmap.PAGESIZE
class MmapTests(unittest.TestCase):
diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py
index 29f823d..be108b1 100644
--- a/Lib/test/test_multiprocessing.py
+++ b/Lib/test/test_multiprocessing.py
@@ -17,20 +17,19 @@ import copy
import socket
import random
import logging
+import test.support
-# Work around broken sem_open implementations
-try:
- import multiprocessing.synchronize
-except ImportError as e:
- raise unittest.SkipTest(e)
+# Skip tests if _multiprocessing wasn't built.
+_multiprocessing = test.support.import_module('_multiprocessing')
+# Skip tests if sem_open implementation is broken.
+test.support.import_module('multiprocessing.synchronize')
import multiprocessing.dummy
import multiprocessing.connection
import multiprocessing.managers
import multiprocessing.heap
import multiprocessing.pool
-import _multiprocessing
from multiprocessing import util
diff --git a/Lib/test/test_nis.py b/Lib/test/test_nis.py
index b4af95e..7aad33d 100644
--- a/Lib/test/test_nis.py
+++ b/Lib/test/test_nis.py
@@ -1,6 +1,8 @@
from test import support
import unittest
-import nis
+
+# Skip test if nis module does not exist.
+nis = support.import_module('nis')
raise unittest.SkipTest("test_nis hangs on Solaris")
diff --git a/Lib/test/test_ossaudiodev.py b/Lib/test/test_ossaudiodev.py
index e49cf2a..603aea3 100644
--- a/Lib/test/test_ossaudiodev.py
+++ b/Lib/test/test_ossaudiodev.py
@@ -3,8 +3,9 @@ support.requires('audio')
from test.support import findfile
+ossaudiodev = support.import_module('ossaudiodev')
+
import errno
-import ossaudiodev
import sys
import sunau
import time
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index 2a0a876..b1a9caf 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -2,17 +2,15 @@
from test import support
-try:
- import posix
-except ImportError:
- raise unittest.SkipTest("posix is not available")
-
import time
import os
import pwd
import shutil
import unittest
import warnings
+
+posix = support.import_module('posix')
+
warnings.filterwarnings('ignore', '.* potential security risk .*',
RuntimeWarning)
diff --git a/Lib/test/test_pwd.py b/Lib/test/test_pwd.py
index b5a5de7..450306c 100644
--- a/Lib/test/test_pwd.py
+++ b/Lib/test/test_pwd.py
@@ -1,7 +1,7 @@
import unittest
from test import support
-import pwd
+pwd = support.import_module('pwd')
class PwdTest(unittest.TestCase):
diff --git a/Lib/test/test_resource.py b/Lib/test/test_resource.py
index 7063ff9..4546349 100644
--- a/Lib/test/test_resource.py
+++ b/Lib/test/test_resource.py
@@ -1,9 +1,9 @@
import unittest
from test import support
-
-import resource
import time
+resource = support.import_module('resource')
+
# This test is checking a few specific problem spots with the resource module.
class ResourceTest(unittest.TestCase):
diff --git a/Lib/test/test_sqlite.py b/Lib/test/test_sqlite.py
index 611b30a..ec6f634 100644
--- a/Lib/test/test_sqlite.py
+++ b/Lib/test/test_sqlite.py
@@ -1,10 +1,9 @@
import unittest
-from test.support import run_unittest
+from test.support import run_unittest, import_module
+
+# Skip test if _sqlite3 module not installed
+import_module('_sqlite3')
-try:
- import _sqlite3
-except ImportError:
- raise unittest.SkipTest('no sqlite available')
from sqlite3.test import (dbapi, types, userfunctions,
factory, transactions, hooks, regression,
dump)
diff --git a/Lib/test/test_startfile.py b/Lib/test/test_startfile.py
index 8d23dbb..7a003eb 100644
--- a/Lib/test/test_startfile.py
+++ b/Lib/test/test_startfile.py
@@ -9,9 +9,11 @@
import unittest
from test import support
+import os
+from os import path
+
+startfile = support.get_attribute(os, 'startfile')
-# use this form so that the test is skipped when startfile is not available:
-from os import startfile, path
class TestCase(unittest.TestCase):
def test_nonexisting(self):
diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py
index fa1727c..f0eb863 100644
--- a/Lib/test/test_tcl.py
+++ b/Lib/test/test_tcl.py
@@ -2,8 +2,11 @@
import unittest
import os
-import _tkinter
from test import support
+
+# Skip this test if the _tkinter module wasn't built.
+_tkinter = support.import_module('_tkinter')
+
from tkinter import Tcl
from _tkinter import TclError
diff --git a/Lib/test/test_tk.py b/Lib/test/test_tk.py
index 20b3fb5..2eca27b 100644
--- a/Lib/test/test_tk.py
+++ b/Lib/test/test_tk.py
@@ -3,6 +3,11 @@ from tkinter.test import runtktests
from test import support
import unittest
+# Skip test if _tkinter wasn't built.
+support.import_module('_tkinter')
+
+import tkinter
+
try:
tkinter.Button()
except tkinter.TclError as msg:
diff --git a/Lib/test/test_ttk_guionly.py b/Lib/test/test_ttk_guionly.py
index 4a9a30c..4e43a18 100644
--- a/Lib/test/test_ttk_guionly.py
+++ b/Lib/test/test_ttk_guionly.py
@@ -1,11 +1,15 @@
import os
import sys
-from tkinter import ttk
-from tkinter.test import runtktests
import unittest
-from _tkinter import TclError
from test import support
+# Skip this test if _tkinter wasn't built.
+support.import_module('_tkinter')
+
+from _tkinter import TclError
+from tkinter import ttk
+from tkinter.test import runtktests
+
try:
ttk.Button()
except TclError as msg:
diff --git a/Lib/test/test_ttk_textonly.py b/Lib/test/test_ttk_textonly.py
index 131e420..b99625a 100644
--- a/Lib/test/test_ttk_textonly.py
+++ b/Lib/test/test_ttk_textonly.py
@@ -1,6 +1,10 @@
import os
import sys
from test import support
+
+# Skip this test if _tkinter does not exist.
+support.import_module('_tkinter')
+
from tkinter.test import runtktests
def test_main():
diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py
index b4ca582..0b778b2 100644
--- a/Lib/test/test_winreg.py
+++ b/Lib/test/test_winreg.py
@@ -2,12 +2,15 @@
# Test the windows specific win32reg module.
# Only win32reg functions not hit here: FlushKey, LoadKey and SaveKey
-from winreg import *
import os, sys
import unittest
-
from test import support
+# Do this first so test will be skipped if module doesn't exist
+support.import_module('winreg')
+# Now import everything
+from winreg import *
+
test_key_name = "SOFTWARE\\Python Registry Test Key - Delete Me"
test_data = [
diff --git a/Lib/test/test_winsound.py b/Lib/test/test_winsound.py
index c39a233..2950bb7 100644
--- a/Lib/test/test_winsound.py
+++ b/Lib/test/test_winsound.py
@@ -3,10 +3,12 @@
import unittest
from test import support
support.requires('audio')
-import winsound, time
+import time
import os
import subprocess
+winsound = support.import_module('winsound')
+
class BeepTest(unittest.TestCase):
# As with PlaySoundTest, incorporate the _have_soundcard() check
diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py
index 4d28d01..71973ed 100644
--- a/Lib/test/test_xml_etree_c.py
+++ b/Lib/test/test_xml_etree_c.py
@@ -5,7 +5,7 @@ import sys
from test import support
-from xml.etree import cElementTree as ET
+ET = support.import_module('xml.etree.cElementTree')
SAMPLE_XML = """
<body>
diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py
index 99c8dda..71f5ecf 100644
--- a/Lib/test/test_zlib.py
+++ b/Lib/test/test_zlib.py
@@ -1,9 +1,10 @@
import unittest
from test import support
-import zlib
import binascii
import random
+zlib = support.import_module('zlib')
+
class ChecksumTestCase(unittest.TestCase):
# checksum test cases
diff --git a/Misc/NEWS b/Misc/NEWS
index 914e257..ee96d22 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -725,6 +725,10 @@ Extension Modules
Tests
-----
+- regrtest no longer treats ImportError as equivalent to SkipTest. Imports
+ that should cause a test to be skipped are now done using import_module
+ from test support, which does the conversion.
+
- Issue #5083: New 'gui' resource for regrtest.