From a21e4ca3c6dc00b2825e2bb4e77a4aa76d8485f0 Mon Sep 17 00:00:00 2001 From: "R. David Murray" Date: Tue, 31 Mar 2009 23:16:50 +0000 Subject: [PATCH] Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge ........ r70734 | r.david.murray | 2009-03-30 15:04:00 -0400 (Mon, 30 Mar 2009) | 7 lines Add import_function method to test.test_support, and modify a number of tests that expect to be skipped if imports fail or functions don't exist to use import_function and import_module. The ultimate goal is to change regrtest to not skip automatically on ImportError. Checking in now to make sure the buldbots don't show any errors on platforms I can't direct test on. ........ r70775 | r.david.murray | 2009-03-30 19:05:48 -0400 (Mon, 30 Mar 2009) | 4 lines Change more tests to use import_module for the modules that should cause tests to be skipped. Also rename import_function to the more descriptive get_attribute and add a docstring. ........ r70856 | r.david.murray | 2009-03-31 14:32:17 -0400 (Tue, 31 Mar 2009) | 7 lines A few more test skips via import_module, and change import_module to return the error message produced by importlib, so that if an import in the package whose import is being wrapped is what failed the skip message will contain the name of that module instead of the name of the wrapped module. Also fixed formatting of some previous comments. ........ r70874 | r.david.murray | 2009-03-31 15:33:15 -0400 (Tue, 31 Mar 2009) | 5 lines Improve test_support.import_module docstring, remove deprecated flag from get_attribute since it isn't likely to do anything useful. ........ r70876 | r.david.murray | 2009-03-31 15:49:15 -0400 (Tue, 31 Mar 2009) | 4 lines Remove the regrtest check that turns any ImportError into a skipped test. Hopefully all modules whose imports legitimately result in a skipped test have been properly wrapped by the previous commits. ........ r70877 | r.david.murray | 2009-03-31 15:57:24 -0400 (Tue, 31 Mar 2009) | 2 lines Add NEWS entry for regrtest change. ........ --- Lib/test/regrtest.py | 2 +- Lib/test/support.py | 26 ++++++++++++++++++++------ Lib/test/test_asynchat.py | 9 ++++++--- Lib/test/test_bz2.py | 4 +++- Lib/test/test_crypt.py | 3 ++- Lib/test/test_ctypes.py | 6 +++++- Lib/test/test_curses.py | 9 ++++++--- Lib/test/test_dbm.py | 4 +++- Lib/test/test_fcntl.py | 7 +++++-- Lib/test/test_fork1.py | 10 ++++------ Lib/test/test_grp.py | 3 ++- Lib/test/test_ioctl.py | 11 ++++------- Lib/test/test_mmap.py | 6 ++++-- Lib/test/test_multiprocessing.py | 11 +++++------ Lib/test/test_nis.py | 4 +++- Lib/test/test_ossaudiodev.py | 3 ++- Lib/test/test_posix.py | 8 +++----- Lib/test/test_pwd.py | 2 +- Lib/test/test_resource.py | 4 ++-- Lib/test/test_sqlite.py | 9 ++++----- Lib/test/test_startfile.py | 6 ++++-- Lib/test/test_tcl.py | 5 ++++- Lib/test/test_tk.py | 5 +++++ Lib/test/test_ttk_guionly.py | 10 +++++++--- Lib/test/test_ttk_textonly.py | 4 ++++ Lib/test/test_winreg.py | 7 +++++-- Lib/test/test_winsound.py | 4 +++- Lib/test/test_xml_etree_c.py | 2 +- Lib/test/test_zlib.py | 3 ++- Misc/NEWS | 4 ++++ 30 files changed, 124 insertions(+), 67 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py index dae7442037e..edfaa9a01cf 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 e20917007d6..9cd50a02f2f 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 db0b194a9ae..3da5878f477 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 18d84bb60e2..6715a023a83 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 b4d0ac97c6e..2adb28d7cea 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 92c98ada284..7d9abdcba72 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 ed93946229c..3f43c11edd6 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 cd2ff2705d2..35d12e43ba8 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 afb511cd063..72748f95167 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 c9f18d9c087..e0366614e47 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 5acda52e9a6..1c1f75f776c 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 f6508c25d23..dcb6695458a 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 a2e9f7242a1..99cc63f077d 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 29f823de080..be108b1d30f 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 b4af95e3d88..7aad33d55d9 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 e49cf2acb91..603aea3f254 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 2a0a876846f..b1a9caf9acf 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 b5a5de79d77..450306c45ae 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 7063ff9c2a6..454634922b5 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 611b30a99a5..ec6f6345924 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 8d23dbb71e5..7a003eb54b6 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 fa1727c81f2..f0eb863594b 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 20b3fb59e32..2eca27b2b06 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 4a9a30cecab..4e43a1873f8 100644 --- a/Lib/test/test_ttk_guionly.py +++ b/Lib/test/test_ttk_guionly.py @@ -1,10 +1,14 @@ import os import sys +import unittest +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 -import unittest -from _tkinter import TclError -from test import support try: ttk.Button() diff --git a/Lib/test/test_ttk_textonly.py b/Lib/test/test_ttk_textonly.py index 131e4200134..b99625a1890 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 b4ca5827c22..0b778b2056e 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 c39a233ca8f..2950bb7d88c 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 4d28d012222..71973ed2347 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 = """ diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py index 99c8ddac715..71f5ecfbb0a 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 914e257a885..ee96d22d837 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.