From 6a10281d3359de890519c23d0318742018c843a3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 27 Apr 2010 23:55:59 +0000 Subject: Issue #7449, last part (11): fix many tests if thread support is disabled * Use try/except ImportError or test_support.import_module() to import thread and threading modules * Add @unittest.skipUnless(threading, ...) to testcases using threads --- Lib/sqlite3/test/dbapi.py | 6 +++++- Lib/test/fork_wait.py | 6 ++++-- Lib/test/test_asyncore.py | 7 ++++++- Lib/test/test_bz2.py | 7 ++++++- Lib/test/test_contextlib.py | 6 +++++- Lib/test/test_docxmlrpc.py | 2 +- Lib/test/test_file2k.py | 6 +++++- Lib/test/test_fork1.py | 4 ++-- Lib/test/test_ftplib.py | 2 +- Lib/test/test_httpservers.py | 2 +- Lib/test/test_io.py | 9 +++++++-- Lib/test/test_logging.py | 8 ++++++-- Lib/test/test_poplib.py | 2 +- Lib/test/test_queue.py | 2 +- Lib/test/test_smtplib.py | 22 +++++++++++++++------- Lib/test/test_socket.py | 17 ++++++++++++++++- Lib/test/test_socketserver.py | 6 +++++- Lib/test/test_telnetlib.py | 2 +- Lib/test/test_thread.py | 2 +- Lib/test/test_threaded_import.py | 4 ++-- Lib/test/test_threadedtempfile.py | 5 ++--- Lib/test/test_threading.py | 4 ++-- Lib/test/test_threading_local.py | 2 +- Lib/test/test_threadsignals.py | 4 ++-- Lib/test/test_urllib2_localnet.py | 2 +- Misc/NEWS | 3 ++- 26 files changed, 101 insertions(+), 41 deletions(-) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py index 9d87212..401ba79 100644 --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -23,8 +23,11 @@ import unittest import sys -import threading import sqlite3 as sqlite +try: + import threading +except ImportError: + threading = None class ModuleTests(unittest.TestCase): def CheckAPILevel(self): @@ -465,6 +468,7 @@ class CursorTests(unittest.TestCase): except TypeError: pass +@unittest.skipUnless(threading, 'This test requires threading.') class ThreadTests(unittest.TestCase): def setUp(self): self.con = sqlite.connect(":memory:") diff --git a/Lib/test/fork_wait.py b/Lib/test/fork_wait.py index 3c75de3..cc51f89 100644 --- a/Lib/test/fork_wait.py +++ b/Lib/test/fork_wait.py @@ -1,6 +1,6 @@ """This test case provides support for checking forking and wait behavior. -To test different wait behavior, overrise the wait_impl method. +To test different wait behavior, override the wait_impl method. We want fork1() semantics -- only the forking thread survives in the child after a fork(). @@ -12,7 +12,9 @@ While BeOS doesn't officially support fork and native threading in the same application, the present example should work just fine. DC """ -import os, sys, time, thread, unittest +import os, sys, time, unittest +import test.test_support as test_support +thread = test_support.import_module('thread') LONGSLEEP = 2 SHORTSLEEP = 0.5 diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py index 1a54ce5..0cf14bf 100644 --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -3,7 +3,6 @@ import unittest import select import os import socket -import threading import sys import time @@ -11,6 +10,11 @@ from test import test_support from test.test_support import TESTFN, run_unittest, unlink from StringIO import StringIO +try: + import threading +except ImportError: + threading = None + HOST = test_support.HOST class dummysocket: @@ -319,6 +323,7 @@ class DispatcherWithSendTests(unittest.TestCase): def tearDown(self): asyncore.close_all() + @unittest.skipUnless(threading, 'Threading required for this test.') @test_support.reap_threads def test_send(self): evt = threading.Event() diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index 0541535..555cdeb 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -7,7 +7,11 @@ from cStringIO import StringIO import os import subprocess import sys -import threading + +try: + import threading +except ImportError: + threading = None bz2 = import_module('bz2') from bz2 import BZ2File, BZ2Compressor, BZ2Decompressor @@ -307,6 +311,7 @@ class BZ2FileTest(BaseTest): else: self.fail("1 // 0 didn't raise an exception") + @unittest.skipUnless(threading, 'Threading required for this test.') def testThreading(self): # Using a BZ2File from several threads doesn't deadlock (issue #7205). data = "1" * 2**20 diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py index 42b90b6..f28c95e 100644 --- a/Lib/test/test_contextlib.py +++ b/Lib/test/test_contextlib.py @@ -3,9 +3,12 @@ import sys import tempfile import unittest -import threading from contextlib import * # Tests __all__ from test import test_support +try: + import threading +except ImportError: + threading = None class ContextManagerTestCase(unittest.TestCase): @@ -264,6 +267,7 @@ class FileContextTestCase(unittest.TestCase): finally: test_support.unlink(tfn) +@unittest.skipUnless(threading, 'Threading required for this test.') class LockContextTestCase(unittest.TestCase): def boilerPlate(self, lock, locked): diff --git a/Lib/test/test_docxmlrpc.py b/Lib/test/test_docxmlrpc.py index 1af3433..716333e 100644 --- a/Lib/test/test_docxmlrpc.py +++ b/Lib/test/test_docxmlrpc.py @@ -2,7 +2,7 @@ from DocXMLRPCServer import DocXMLRPCServer import httplib import sys from test import test_support -import threading +threading = test_support.import_module('threading') import time import socket import unittest diff --git a/Lib/test/test_file2k.py b/Lib/test/test_file2k.py index a7681a9..accdc95 100644 --- a/Lib/test/test_file2k.py +++ b/Lib/test/test_file2k.py @@ -3,9 +3,12 @@ import os import unittest import itertools import time -import threading from array import array from weakref import proxy +try: + import threading +except ImportError: + threading = None from test import test_support from test.test_support import TESTFN, run_unittest @@ -411,6 +414,7 @@ class FileSubclassTests(unittest.TestCase): self.assertTrue(f.subclass_closed) +@unittest.skipUnless(threading, 'Threading required for this test.') class FileThreadingTests(unittest.TestCase): # These tests check the ability to call various methods of file objects # (including close()) concurrently without crashing the Python interpreter. diff --git a/Lib/test/test_fork1.py b/Lib/test/test_fork1.py index 0640071..3930667 100644 --- a/Lib/test/test_fork1.py +++ b/Lib/test/test_fork1.py @@ -6,10 +6,10 @@ import os import signal import sys import time -import threading from test.fork_wait import ForkWait -from test.test_support import run_unittest, reap_children, get_attribute +from test.test_support import run_unittest, reap_children, get_attribute, import_module +threading = import_module('threading') #Skip test if fork does not exist. get_attribute(os, 'fork') diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py index 4f6d1c1..3a2ec5e 100644 --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -4,7 +4,6 @@ # environment import ftplib -import threading import asyncore import asynchat import socket @@ -19,6 +18,7 @@ except ImportError: from unittest import TestCase from test import test_support from test.test_support import HOST +threading = test_support.import_module('threading') # the dummy data returned by server over the data channel when diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index e392aee..0dc0a32 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -16,10 +16,10 @@ import shutil import urllib import httplib import tempfile -import threading import unittest from test import test_support +threading = test_support.import_module('threading') class NoLogRequestHandler: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 9ffe646..b3feb1b 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -26,7 +26,6 @@ import os import sys import time import array -import threading import random import unittest import weakref @@ -38,6 +37,10 @@ from test import test_support as support import codecs import io # C implementation of io import _pyio as pyio # Python implementation of io +try: + import threading +except ImportError: + threading = None __metaclass__ = type bytes = support.py3k_bytes @@ -749,6 +752,7 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests): self.assertEquals(b"abcdefg", bufio.read()) + @unittest.skipUnless(threading, 'Threading required for this test.') def test_threads(self): try: # Write out many bytes with exactly the same number of 0's, @@ -996,6 +1000,7 @@ class BufferedWriterTest(unittest.TestCase, CommonBufferedTests): with self.open(support.TESTFN, "rb", buffering=0) as f: self.assertEqual(f.read(), b"abc") + @unittest.skipUnless(threading, 'Threading required for this test.') def test_threads(self): try: # Write out many bytes from many threads and test they were @@ -2090,7 +2095,7 @@ class TextIOWrapperTest(unittest.TestCase): with self.open(support.TESTFN, "w", errors="replace") as f: self.assertEqual(f.errors, "replace") - + @unittest.skipUnless(threading, 'Threading required for this test.') def test_threads_write(self): # Issue6750: concurrent writes could duplicate data event = threading.Event() diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 432493b..0211f56 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -41,11 +41,13 @@ import tempfile from test.test_support import captured_stdout, run_with_locale, run_unittest,\ find_unused_port import textwrap -import threading import unittest import warnings import weakref - +try: + import threading +except ImportError: + threading = None class BaseTest(unittest.TestCase): @@ -765,6 +767,7 @@ class LogRecordSocketReceiver(ThreadingTCPServer): self.server_close() +@unittest.skipUnless(threading, 'Threading required for this test.') class SocketHandlerTest(BaseTest): """Test for SocketHandler objects.""" @@ -1659,6 +1662,7 @@ class ConfigDictTest(BaseTest): def test_config13_failure(self): self.assertRaises(StandardError, self.apply_config, self.config13) + @unittest.skipUnless(threading, 'listen() needs threading to work') def setup_via_listener(self, text): port = find_unused_port() t = logging.config.listen(port) diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py index f75f0b1..4375f71 100644 --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -4,7 +4,6 @@ # a real test suite import poplib -import threading import asyncore import asynchat import socket @@ -15,6 +14,7 @@ import errno from unittest import TestCase from test import test_support from test.test_support import HOST +threading = test_support.import_module('threading') # the dummy data returned by server when LIST and RETR commands are issued diff --git a/Lib/test/test_queue.py b/Lib/test/test_queue.py index 1636280..5f5a6ac 100644 --- a/Lib/test/test_queue.py +++ b/Lib/test/test_queue.py @@ -1,10 +1,10 @@ # Some simple queue module tests, plus some failure conditions # to ensure the Queue locks remain stable. import Queue -import threading import time import unittest from test import test_support +threading = test_support.import_module('threading') QUEUE_SIZE = 5 diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py index 9a492f6..977a152 100644 --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -1,7 +1,6 @@ import asyncore import email.utils import socket -import threading import smtpd import smtplib import StringIO @@ -9,9 +8,14 @@ import sys import time import select -from unittest import TestCase +import unittest from test import test_support +try: + import threading +except ImportError: + threading = None + HOST = test_support.HOST def server(evt, buf, serv): @@ -36,7 +40,8 @@ def server(evt, buf, serv): serv.close() evt.set() -class GeneralTests(TestCase): +@unittest.skipUnless(threading, 'Threading required for this test.') +class GeneralTests(unittest.TestCase): def setUp(self): self._threads = test_support.threading_setup() @@ -138,7 +143,8 @@ MSG_END = '------------ END MESSAGE ------------\n' # test server times out, causing the test to fail. # Test behavior of smtpd.DebuggingServer -class DebuggingServerTests(TestCase): +@unittest.skipUnless(threading, 'Threading required for this test.') +class DebuggingServerTests(unittest.TestCase): def setUp(self): # temporarily replace sys.stdout to capture DebuggingServer output @@ -233,7 +239,7 @@ class DebuggingServerTests(TestCase): self.assertEqual(self.output.getvalue(), mexpect) -class NonConnectingTests(TestCase): +class NonConnectingTests(unittest.TestCase): def testNotConnected(self): # Test various operations on an unconnected SMTP object that @@ -254,7 +260,8 @@ class NonConnectingTests(TestCase): # test response of client to a non-successful HELO message -class BadHELOServerTests(TestCase): +@unittest.skipUnless(threading, 'Threading required for this test.') +class BadHELOServerTests(unittest.TestCase): def setUp(self): self.old_stdout = sys.stdout @@ -378,7 +385,8 @@ class SimSMTPServer(smtpd.SMTPServer): # Test various SMTP & ESMTP commands/behaviors that require a simulated server # (i.e., something with more features than DebuggingServer) -class SMTPSimTests(TestCase): +@unittest.skipUnless(threading, 'Threading required for this test.') +class SMTPSimTests(unittest.TestCase): def setUp(self): self._threads = test_support.threading_setup() diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index f699e3c..0ce329f 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -6,7 +6,6 @@ from test import test_support import errno import socket import select -import thread, threading import time import traceback import Queue @@ -16,6 +15,13 @@ import array from weakref import proxy import signal +try: + import thread + import threading +except ImportError: + thread = None + threading = None + HOST = test_support.HOST MSG = 'Michael Gilfix was here\n' @@ -550,6 +556,7 @@ class GeneralModuleTests(unittest.TestCase): s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100)) +@unittest.skipUnless(thread, 'Threading required for this test.') class BasicTCPTest(SocketConnectedTest): def __init__(self, methodName='runTest'): @@ -630,6 +637,7 @@ class BasicTCPTest(SocketConnectedTest): self.serv_conn.send(MSG) self.serv_conn.shutdown(2) +@unittest.skipUnless(thread, 'Threading required for this test.') class BasicUDPTest(ThreadedUDPSocketTest): def __init__(self, methodName='runTest'): @@ -658,6 +666,7 @@ class BasicUDPTest(ThreadedUDPSocketTest): def _testRecvFromNegative(self): self.cli.sendto(MSG, 0, (HOST, self.port)) +@unittest.skipUnless(thread, 'Threading required for this test.') class TCPCloserTest(ThreadedTCPSocketTest): def testClose(self): @@ -673,6 +682,7 @@ class TCPCloserTest(ThreadedTCPSocketTest): self.cli.connect((HOST, self.port)) time.sleep(1.0) +@unittest.skipUnless(thread, 'Threading required for this test.') class BasicSocketPairTest(SocketPairTest): def __init__(self, methodName='runTest'): @@ -692,6 +702,7 @@ class BasicSocketPairTest(SocketPairTest): msg = self.cli.recv(1024) self.assertEqual(msg, MSG) +@unittest.skipUnless(thread, 'Threading required for this test.') class NonBlockingTCPTests(ThreadedTCPSocketTest): def __init__(self, methodName='runTest'): @@ -760,6 +771,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest): time.sleep(0.1) self.cli.send(MSG) +@unittest.skipUnless(thread, 'Threading required for this test.') class FileObjectClassTestCase(SocketConnectedTest): bufsize = -1 # Use default buffer size @@ -989,6 +1001,7 @@ class NetworkConnectionNoServer(unittest.TestCase): lambda: socket.create_connection((HOST, port)) ) +@unittest.skipUnless(thread, 'Threading required for this test.') class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest): def __init__(self, methodName='runTest'): @@ -1051,6 +1064,7 @@ class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest): self.cli = socket.create_connection((HOST, self.port), 30) self.assertEqual(self.cli.gettimeout(), 30) +@unittest.skipUnless(thread, 'Threading required for this test.') class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest): def __init__(self, methodName='runTest'): @@ -1220,6 +1234,7 @@ class TestLinuxAbstractNamespace(unittest.TestCase): self.assertRaises(socket.error, s.bind, address) +@unittest.skipUnless(thread, 'Threading required for this test.') class BufferIOTest(SocketConnectedTest): """ Test the buffer versions of socket.recv() and socket.send(). diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py index 4f0dd3e..a478bd4 100644 --- a/Lib/test/test_socketserver.py +++ b/Lib/test/test_socketserver.py @@ -9,12 +9,15 @@ import select import signal import socket import tempfile -import threading import unittest import SocketServer import test.test_support from test.test_support import reap_children, reap_threads, verbose +try: + import threading +except ImportError: + threading = None test.test_support.requires("network") @@ -119,6 +122,7 @@ class SocketServerTest(unittest.TestCase): self.assertEquals(server.server_address, server.socket.getsockname()) return server + @unittest.skipUnless(threading, 'Threading required for this test.') @reap_threads def run_server(self, svrcls, hdlrbase, testfunc): server = self.make_server(self.pickaddr(svrcls.address_family), diff --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py index a04bc3f..fd5c6f7 100644 --- a/Lib/test/test_telnetlib.py +++ b/Lib/test/test_telnetlib.py @@ -1,11 +1,11 @@ import socket -import threading import telnetlib import time import Queue from unittest import TestCase from test import test_support +threading = test_support.import_module('threading') HOST = test_support.HOST EOF_sigil = object() diff --git a/Lib/test/test_thread.py b/Lib/test/test_thread.py index 33109ec..544e70d 100644 --- a/Lib/test/test_thread.py +++ b/Lib/test/test_thread.py @@ -2,7 +2,7 @@ import os import unittest import random from test import test_support -import thread +thread = test_support.import_module('thread') import time import sys import weakref diff --git a/Lib/test/test_threaded_import.py b/Lib/test/test_threaded_import.py index 4b925c4..b31fdf1 100644 --- a/Lib/test/test_threaded_import.py +++ b/Lib/test/test_threaded_import.py @@ -5,9 +5,9 @@ # complains several times about module random having no attribute # randrange, and then Python hangs. -import thread import unittest -from test.test_support import verbose, TestFailed +from test.test_support import verbose, TestFailed, import_module +thread = import_module('thread') critical_section = thread.allocate_lock() done = thread.allocate_lock() diff --git a/Lib/test/test_threadedtempfile.py b/Lib/test/test_threadedtempfile.py index 753f388..4aeb711 100644 --- a/Lib/test/test_threadedtempfile.py +++ b/Lib/test/test_threadedtempfile.py @@ -16,11 +16,10 @@ provoking a 2.0 failure under Linux. NUM_THREADS = 20 FILES_PER_THREAD = 50 -import thread # If this fails, we can't test this module -import threading import tempfile -from test.test_support import threading_setup, threading_cleanup, run_unittest +from test.test_support import threading_setup, threading_cleanup, run_unittest, import_module +threading = import_module('threading') import unittest import StringIO from traceback import print_exc diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 70dd026..2e2558a 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -5,8 +5,8 @@ from test.test_support import verbose import random import re import sys -import threading -import thread +thread = test.test_support.import_module('thread') +threading = test.test_support.import_module('threading') import time import unittest import weakref diff --git a/Lib/test/test_threading_local.py b/Lib/test/test_threading_local.py index ab3b358..ad0f43c 100644 --- a/Lib/test/test_threading_local.py +++ b/Lib/test/test_threading_local.py @@ -1,7 +1,7 @@ import unittest from doctest import DocTestSuite from test import test_support -import threading +threading = test_support.import_module('threading') import weakref import gc diff --git a/Lib/test/test_threadsignals.py b/Lib/test/test_threadsignals.py index b28705f..127ddd2 100644 --- a/Lib/test/test_threadsignals.py +++ b/Lib/test/test_threadsignals.py @@ -1,11 +1,11 @@ """PyUnit testing that threads honor our signal semantics""" import unittest -import thread import signal import os import sys -from test.test_support import run_unittest +from test.test_support import run_unittest, import_module +thread = import_module('thread') if sys.platform[:3] in ('win', 'os2') or sys.platform=='riscos': raise unittest.SkipTest, "Can't test signal on %s" % sys.platform diff --git a/Lib/test/test_urllib2_localnet.py b/Lib/test/test_urllib2_localnet.py index e3860f2..ef2614bc 100644 --- a/Lib/test/test_urllib2_localnet.py +++ b/Lib/test/test_urllib2_localnet.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import threading import urlparse import urllib2 import BaseHTTPServer @@ -8,6 +7,7 @@ import unittest import hashlib from test import test_support mimetools = test_support.import_module('mimetools', deprecated=True) +threading = test_support.import_module('threading') # Loopback http server infrastructure diff --git a/Misc/NEWS b/Misc/NEWS index 929a246..d026e36 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -112,7 +112,8 @@ Extension Modules Tests ----- -- Issue #7449: Fix many tests to support Python compiled without thread support +- Issue #7449: Fix many tests to support Python compiled without thread + support. Patches written by Jerry Seutter. - Issue #8108: test_ftplib's non-blocking SSL server now has proper handling of SSL shutdowns. -- cgit v0.12