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
This commit is contained in:
Victor Stinner 2010-04-27 23:55:59 +00:00
parent c73a05f775
commit 6a10281d33
26 changed files with 101 additions and 41 deletions

View file

@ -23,8 +23,11 @@
import unittest import unittest
import sys import sys
import threading
import sqlite3 as sqlite import sqlite3 as sqlite
try:
import threading
except ImportError:
threading = None
class ModuleTests(unittest.TestCase): class ModuleTests(unittest.TestCase):
def CheckAPILevel(self): def CheckAPILevel(self):
@ -465,6 +468,7 @@ class CursorTests(unittest.TestCase):
except TypeError: except TypeError:
pass pass
@unittest.skipUnless(threading, 'This test requires threading.')
class ThreadTests(unittest.TestCase): class ThreadTests(unittest.TestCase):
def setUp(self): def setUp(self):
self.con = sqlite.connect(":memory:") self.con = sqlite.connect(":memory:")

View file

@ -1,6 +1,6 @@
"""This test case provides support for checking forking and wait behavior. """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 We want fork1() semantics -- only the forking thread survives in the
child after a fork(). 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 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 LONGSLEEP = 2
SHORTSLEEP = 0.5 SHORTSLEEP = 0.5

View file

@ -3,7 +3,6 @@ import unittest
import select import select
import os import os
import socket import socket
import threading
import sys import sys
import time import time
@ -11,6 +10,11 @@ from test import test_support
from test.test_support import TESTFN, run_unittest, unlink from test.test_support import TESTFN, run_unittest, unlink
from StringIO import StringIO from StringIO import StringIO
try:
import threading
except ImportError:
threading = None
HOST = test_support.HOST HOST = test_support.HOST
class dummysocket: class dummysocket:
@ -319,6 +323,7 @@ class DispatcherWithSendTests(unittest.TestCase):
def tearDown(self): def tearDown(self):
asyncore.close_all() asyncore.close_all()
@unittest.skipUnless(threading, 'Threading required for this test.')
@test_support.reap_threads @test_support.reap_threads
def test_send(self): def test_send(self):
evt = threading.Event() evt = threading.Event()

View file

@ -7,7 +7,11 @@ from cStringIO import StringIO
import os import os
import subprocess import subprocess
import sys import sys
try:
import threading import threading
except ImportError:
threading = None
bz2 = import_module('bz2') bz2 = import_module('bz2')
from bz2 import BZ2File, BZ2Compressor, BZ2Decompressor from bz2 import BZ2File, BZ2Compressor, BZ2Decompressor
@ -307,6 +311,7 @@ class BZ2FileTest(BaseTest):
else: else:
self.fail("1 // 0 didn't raise an exception") self.fail("1 // 0 didn't raise an exception")
@unittest.skipUnless(threading, 'Threading required for this test.')
def testThreading(self): def testThreading(self):
# Using a BZ2File from several threads doesn't deadlock (issue #7205). # Using a BZ2File from several threads doesn't deadlock (issue #7205).
data = "1" * 2**20 data = "1" * 2**20

View file

@ -3,9 +3,12 @@
import sys import sys
import tempfile import tempfile
import unittest import unittest
import threading
from contextlib import * # Tests __all__ from contextlib import * # Tests __all__
from test import test_support from test import test_support
try:
import threading
except ImportError:
threading = None
class ContextManagerTestCase(unittest.TestCase): class ContextManagerTestCase(unittest.TestCase):
@ -264,6 +267,7 @@ class FileContextTestCase(unittest.TestCase):
finally: finally:
test_support.unlink(tfn) test_support.unlink(tfn)
@unittest.skipUnless(threading, 'Threading required for this test.')
class LockContextTestCase(unittest.TestCase): class LockContextTestCase(unittest.TestCase):
def boilerPlate(self, lock, locked): def boilerPlate(self, lock, locked):

View file

@ -2,7 +2,7 @@ from DocXMLRPCServer import DocXMLRPCServer
import httplib import httplib
import sys import sys
from test import test_support from test import test_support
import threading threading = test_support.import_module('threading')
import time import time
import socket import socket
import unittest import unittest

View file

@ -3,9 +3,12 @@ import os
import unittest import unittest
import itertools import itertools
import time import time
import threading
from array import array from array import array
from weakref import proxy from weakref import proxy
try:
import threading
except ImportError:
threading = None
from test import test_support from test import test_support
from test.test_support import TESTFN, run_unittest from test.test_support import TESTFN, run_unittest
@ -411,6 +414,7 @@ class FileSubclassTests(unittest.TestCase):
self.assertTrue(f.subclass_closed) self.assertTrue(f.subclass_closed)
@unittest.skipUnless(threading, 'Threading required for this test.')
class FileThreadingTests(unittest.TestCase): class FileThreadingTests(unittest.TestCase):
# These tests check the ability to call various methods of file objects # These tests check the ability to call various methods of file objects
# (including close()) concurrently without crashing the Python interpreter. # (including close()) concurrently without crashing the Python interpreter.

View file

@ -6,10 +6,10 @@ import os
import signal import signal
import sys import sys
import time import time
import threading
from test.fork_wait import ForkWait 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. #Skip test if fork does not exist.
get_attribute(os, 'fork') get_attribute(os, 'fork')

View file

@ -4,7 +4,6 @@
# environment # environment
import ftplib import ftplib
import threading
import asyncore import asyncore
import asynchat import asynchat
import socket import socket
@ -19,6 +18,7 @@ except ImportError:
from unittest import TestCase from unittest import TestCase
from test import test_support from test import test_support
from test.test_support import HOST from test.test_support import HOST
threading = test_support.import_module('threading')
# the dummy data returned by server over the data channel when # the dummy data returned by server over the data channel when

View file

@ -16,10 +16,10 @@ import shutil
import urllib import urllib
import httplib import httplib
import tempfile import tempfile
import threading
import unittest import unittest
from test import test_support from test import test_support
threading = test_support.import_module('threading')
class NoLogRequestHandler: class NoLogRequestHandler:

View file

@ -26,7 +26,6 @@ import os
import sys import sys
import time import time
import array import array
import threading
import random import random
import unittest import unittest
import weakref import weakref
@ -38,6 +37,10 @@ from test import test_support as support
import codecs import codecs
import io # C implementation of io import io # C implementation of io
import _pyio as pyio # Python implementation of io import _pyio as pyio # Python implementation of io
try:
import threading
except ImportError:
threading = None
__metaclass__ = type __metaclass__ = type
bytes = support.py3k_bytes bytes = support.py3k_bytes
@ -749,6 +752,7 @@ class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
self.assertEquals(b"abcdefg", bufio.read()) self.assertEquals(b"abcdefg", bufio.read())
@unittest.skipUnless(threading, 'Threading required for this test.')
def test_threads(self): def test_threads(self):
try: try:
# Write out many bytes with exactly the same number of 0's, # 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: with self.open(support.TESTFN, "rb", buffering=0) as f:
self.assertEqual(f.read(), b"abc") self.assertEqual(f.read(), b"abc")
@unittest.skipUnless(threading, 'Threading required for this test.')
def test_threads(self): def test_threads(self):
try: try:
# Write out many bytes from many threads and test they were # 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: with self.open(support.TESTFN, "w", errors="replace") as f:
self.assertEqual(f.errors, "replace") self.assertEqual(f.errors, "replace")
@unittest.skipUnless(threading, 'Threading required for this test.')
def test_threads_write(self): def test_threads_write(self):
# Issue6750: concurrent writes could duplicate data # Issue6750: concurrent writes could duplicate data
event = threading.Event() event = threading.Event()

View file

@ -41,11 +41,13 @@ import tempfile
from test.test_support import captured_stdout, run_with_locale, run_unittest,\ from test.test_support import captured_stdout, run_with_locale, run_unittest,\
find_unused_port find_unused_port
import textwrap import textwrap
import threading
import unittest import unittest
import warnings import warnings
import weakref import weakref
try:
import threading
except ImportError:
threading = None
class BaseTest(unittest.TestCase): class BaseTest(unittest.TestCase):
@ -765,6 +767,7 @@ class LogRecordSocketReceiver(ThreadingTCPServer):
self.server_close() self.server_close()
@unittest.skipUnless(threading, 'Threading required for this test.')
class SocketHandlerTest(BaseTest): class SocketHandlerTest(BaseTest):
"""Test for SocketHandler objects.""" """Test for SocketHandler objects."""
@ -1659,6 +1662,7 @@ class ConfigDictTest(BaseTest):
def test_config13_failure(self): def test_config13_failure(self):
self.assertRaises(StandardError, self.apply_config, self.config13) self.assertRaises(StandardError, self.apply_config, self.config13)
@unittest.skipUnless(threading, 'listen() needs threading to work')
def setup_via_listener(self, text): def setup_via_listener(self, text):
port = find_unused_port() port = find_unused_port()
t = logging.config.listen(port) t = logging.config.listen(port)

View file

@ -4,7 +4,6 @@
# a real test suite # a real test suite
import poplib import poplib
import threading
import asyncore import asyncore
import asynchat import asynchat
import socket import socket
@ -15,6 +14,7 @@ import errno
from unittest import TestCase from unittest import TestCase
from test import test_support from test import test_support
from test.test_support import HOST 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 # the dummy data returned by server when LIST and RETR commands are issued

View file

@ -1,10 +1,10 @@
# Some simple queue module tests, plus some failure conditions # Some simple queue module tests, plus some failure conditions
# to ensure the Queue locks remain stable. # to ensure the Queue locks remain stable.
import Queue import Queue
import threading
import time import time
import unittest import unittest
from test import test_support from test import test_support
threading = test_support.import_module('threading')
QUEUE_SIZE = 5 QUEUE_SIZE = 5

View file

@ -1,7 +1,6 @@
import asyncore import asyncore
import email.utils import email.utils
import socket import socket
import threading
import smtpd import smtpd
import smtplib import smtplib
import StringIO import StringIO
@ -9,9 +8,14 @@ import sys
import time import time
import select import select
from unittest import TestCase import unittest
from test import test_support from test import test_support
try:
import threading
except ImportError:
threading = None
HOST = test_support.HOST HOST = test_support.HOST
def server(evt, buf, serv): def server(evt, buf, serv):
@ -36,7 +40,8 @@ def server(evt, buf, serv):
serv.close() serv.close()
evt.set() evt.set()
class GeneralTests(TestCase): @unittest.skipUnless(threading, 'Threading required for this test.')
class GeneralTests(unittest.TestCase):
def setUp(self): def setUp(self):
self._threads = test_support.threading_setup() 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 server times out, causing the test to fail.
# Test behavior of smtpd.DebuggingServer # Test behavior of smtpd.DebuggingServer
class DebuggingServerTests(TestCase): @unittest.skipUnless(threading, 'Threading required for this test.')
class DebuggingServerTests(unittest.TestCase):
def setUp(self): def setUp(self):
# temporarily replace sys.stdout to capture DebuggingServer output # temporarily replace sys.stdout to capture DebuggingServer output
@ -233,7 +239,7 @@ class DebuggingServerTests(TestCase):
self.assertEqual(self.output.getvalue(), mexpect) self.assertEqual(self.output.getvalue(), mexpect)
class NonConnectingTests(TestCase): class NonConnectingTests(unittest.TestCase):
def testNotConnected(self): def testNotConnected(self):
# Test various operations on an unconnected SMTP object that # 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 # 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): def setUp(self):
self.old_stdout = sys.stdout self.old_stdout = sys.stdout
@ -378,7 +385,8 @@ class SimSMTPServer(smtpd.SMTPServer):
# Test various SMTP & ESMTP commands/behaviors that require a simulated server # Test various SMTP & ESMTP commands/behaviors that require a simulated server
# (i.e., something with more features than DebuggingServer) # (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): def setUp(self):
self._threads = test_support.threading_setup() self._threads = test_support.threading_setup()

View file

@ -6,7 +6,6 @@ from test import test_support
import errno import errno
import socket import socket
import select import select
import thread, threading
import time import time
import traceback import traceback
import Queue import Queue
@ -16,6 +15,13 @@ import array
from weakref import proxy from weakref import proxy
import signal import signal
try:
import thread
import threading
except ImportError:
thread = None
threading = None
HOST = test_support.HOST HOST = test_support.HOST
MSG = 'Michael Gilfix was here\n' MSG = 'Michael Gilfix was here\n'
@ -550,6 +556,7 @@ class GeneralModuleTests(unittest.TestCase):
s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100)) s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
@unittest.skipUnless(thread, 'Threading required for this test.')
class BasicTCPTest(SocketConnectedTest): class BasicTCPTest(SocketConnectedTest):
def __init__(self, methodName='runTest'): def __init__(self, methodName='runTest'):
@ -630,6 +637,7 @@ class BasicTCPTest(SocketConnectedTest):
self.serv_conn.send(MSG) self.serv_conn.send(MSG)
self.serv_conn.shutdown(2) self.serv_conn.shutdown(2)
@unittest.skipUnless(thread, 'Threading required for this test.')
class BasicUDPTest(ThreadedUDPSocketTest): class BasicUDPTest(ThreadedUDPSocketTest):
def __init__(self, methodName='runTest'): def __init__(self, methodName='runTest'):
@ -658,6 +666,7 @@ class BasicUDPTest(ThreadedUDPSocketTest):
def _testRecvFromNegative(self): def _testRecvFromNegative(self):
self.cli.sendto(MSG, 0, (HOST, self.port)) self.cli.sendto(MSG, 0, (HOST, self.port))
@unittest.skipUnless(thread, 'Threading required for this test.')
class TCPCloserTest(ThreadedTCPSocketTest): class TCPCloserTest(ThreadedTCPSocketTest):
def testClose(self): def testClose(self):
@ -673,6 +682,7 @@ class TCPCloserTest(ThreadedTCPSocketTest):
self.cli.connect((HOST, self.port)) self.cli.connect((HOST, self.port))
time.sleep(1.0) time.sleep(1.0)
@unittest.skipUnless(thread, 'Threading required for this test.')
class BasicSocketPairTest(SocketPairTest): class BasicSocketPairTest(SocketPairTest):
def __init__(self, methodName='runTest'): def __init__(self, methodName='runTest'):
@ -692,6 +702,7 @@ class BasicSocketPairTest(SocketPairTest):
msg = self.cli.recv(1024) msg = self.cli.recv(1024)
self.assertEqual(msg, MSG) self.assertEqual(msg, MSG)
@unittest.skipUnless(thread, 'Threading required for this test.')
class NonBlockingTCPTests(ThreadedTCPSocketTest): class NonBlockingTCPTests(ThreadedTCPSocketTest):
def __init__(self, methodName='runTest'): def __init__(self, methodName='runTest'):
@ -760,6 +771,7 @@ class NonBlockingTCPTests(ThreadedTCPSocketTest):
time.sleep(0.1) time.sleep(0.1)
self.cli.send(MSG) self.cli.send(MSG)
@unittest.skipUnless(thread, 'Threading required for this test.')
class FileObjectClassTestCase(SocketConnectedTest): class FileObjectClassTestCase(SocketConnectedTest):
bufsize = -1 # Use default buffer size bufsize = -1 # Use default buffer size
@ -989,6 +1001,7 @@ class NetworkConnectionNoServer(unittest.TestCase):
lambda: socket.create_connection((HOST, port)) lambda: socket.create_connection((HOST, port))
) )
@unittest.skipUnless(thread, 'Threading required for this test.')
class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest): class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
def __init__(self, methodName='runTest'): def __init__(self, methodName='runTest'):
@ -1051,6 +1064,7 @@ class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
self.cli = socket.create_connection((HOST, self.port), 30) self.cli = socket.create_connection((HOST, self.port), 30)
self.assertEqual(self.cli.gettimeout(), 30) self.assertEqual(self.cli.gettimeout(), 30)
@unittest.skipUnless(thread, 'Threading required for this test.')
class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest): class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
def __init__(self, methodName='runTest'): def __init__(self, methodName='runTest'):
@ -1220,6 +1234,7 @@ class TestLinuxAbstractNamespace(unittest.TestCase):
self.assertRaises(socket.error, s.bind, address) self.assertRaises(socket.error, s.bind, address)
@unittest.skipUnless(thread, 'Threading required for this test.')
class BufferIOTest(SocketConnectedTest): class BufferIOTest(SocketConnectedTest):
""" """
Test the buffer versions of socket.recv() and socket.send(). Test the buffer versions of socket.recv() and socket.send().

View file

@ -9,12 +9,15 @@ import select
import signal import signal
import socket import socket
import tempfile import tempfile
import threading
import unittest import unittest
import SocketServer import SocketServer
import test.test_support import test.test_support
from test.test_support import reap_children, reap_threads, verbose from test.test_support import reap_children, reap_threads, verbose
try:
import threading
except ImportError:
threading = None
test.test_support.requires("network") test.test_support.requires("network")
@ -119,6 +122,7 @@ class SocketServerTest(unittest.TestCase):
self.assertEquals(server.server_address, server.socket.getsockname()) self.assertEquals(server.server_address, server.socket.getsockname())
return server return server
@unittest.skipUnless(threading, 'Threading required for this test.')
@reap_threads @reap_threads
def run_server(self, svrcls, hdlrbase, testfunc): def run_server(self, svrcls, hdlrbase, testfunc):
server = self.make_server(self.pickaddr(svrcls.address_family), server = self.make_server(self.pickaddr(svrcls.address_family),

View file

@ -1,11 +1,11 @@
import socket import socket
import threading
import telnetlib import telnetlib
import time import time
import Queue import Queue
from unittest import TestCase from unittest import TestCase
from test import test_support from test import test_support
threading = test_support.import_module('threading')
HOST = test_support.HOST HOST = test_support.HOST
EOF_sigil = object() EOF_sigil = object()

View file

@ -2,7 +2,7 @@ import os
import unittest import unittest
import random import random
from test import test_support from test import test_support
import thread thread = test_support.import_module('thread')
import time import time
import sys import sys
import weakref import weakref

View file

@ -5,9 +5,9 @@
# complains several times about module random having no attribute # complains several times about module random having no attribute
# randrange, and then Python hangs. # randrange, and then Python hangs.
import thread
import unittest 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() critical_section = thread.allocate_lock()
done = thread.allocate_lock() done = thread.allocate_lock()

View file

@ -16,11 +16,10 @@ provoking a 2.0 failure under Linux.
NUM_THREADS = 20 NUM_THREADS = 20
FILES_PER_THREAD = 50 FILES_PER_THREAD = 50
import thread # If this fails, we can't test this module
import threading
import tempfile 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 unittest
import StringIO import StringIO
from traceback import print_exc from traceback import print_exc

View file

@ -5,8 +5,8 @@ from test.test_support import verbose
import random import random
import re import re
import sys import sys
import threading thread = test.test_support.import_module('thread')
import thread threading = test.test_support.import_module('threading')
import time import time
import unittest import unittest
import weakref import weakref

View file

@ -1,7 +1,7 @@
import unittest import unittest
from doctest import DocTestSuite from doctest import DocTestSuite
from test import test_support from test import test_support
import threading threading = test_support.import_module('threading')
import weakref import weakref
import gc import gc

View file

@ -1,11 +1,11 @@
"""PyUnit testing that threads honor our signal semantics""" """PyUnit testing that threads honor our signal semantics"""
import unittest import unittest
import thread
import signal import signal
import os import os
import sys 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': if sys.platform[:3] in ('win', 'os2') or sys.platform=='riscos':
raise unittest.SkipTest, "Can't test signal on %s" % sys.platform raise unittest.SkipTest, "Can't test signal on %s" % sys.platform

View file

@ -1,6 +1,5 @@
#!/usr/bin/env python #!/usr/bin/env python
import threading
import urlparse import urlparse
import urllib2 import urllib2
import BaseHTTPServer import BaseHTTPServer
@ -8,6 +7,7 @@ import unittest
import hashlib import hashlib
from test import test_support from test import test_support
mimetools = test_support.import_module('mimetools', deprecated=True) mimetools = test_support.import_module('mimetools', deprecated=True)
threading = test_support.import_module('threading')
# Loopback http server infrastructure # Loopback http server infrastructure

View file

@ -112,7 +112,8 @@ Extension Modules
Tests 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 - Issue #8108: test_ftplib's non-blocking SSL server now has proper handling
of SSL shutdowns. of SSL shutdowns.