Commit 69669604 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-30830: test_logging uses threading_setup/cleanup (#3137)

* bpo-30830: test_logging uses threading_setup/cleanup

Replace @support.reap_threads on some methods with
support.threading_setup() in setUp() and support.threading_cleanup()
in tearDown() in BaseTest.

* bpo-30830: test_logging disables threaded socketserver tests

Disable tests because of socketserver.ThreadingMixIn leaks threads,
whereas leaking threads now makes a test to fail on buildbots.

Disable tests until socketserver is fixed: bpo-31233.

* Skip also setup_via_listener()
parent 93d0cb58
...@@ -79,6 +79,8 @@ class BaseTest(unittest.TestCase): ...@@ -79,6 +79,8 @@ class BaseTest(unittest.TestCase):
def setUp(self): def setUp(self):
"""Setup the default logging stream to an internal StringIO instance, """Setup the default logging stream to an internal StringIO instance,
so that we can examine log output as we want.""" so that we can examine log output as we want."""
self._threading_key = support.threading_setup()
logger_dict = logging.getLogger().manager.loggerDict logger_dict = logging.getLogger().manager.loggerDict
logging._acquireLock() logging._acquireLock()
try: try:
...@@ -147,6 +149,9 @@ class BaseTest(unittest.TestCase): ...@@ -147,6 +149,9 @@ class BaseTest(unittest.TestCase):
finally: finally:
logging._releaseLock() logging._releaseLock()
self.doCleanups()
support.threading_cleanup(*self._threading_key)
def assert_log_lines(self, expected_values, stream=None, pat=None): def assert_log_lines(self, expected_values, stream=None, pat=None):
"""Match the collected log lines against the regular expression """Match the collected log lines against the regular expression
self.expected_log_pat, and compare the extracted group values to self.expected_log_pat, and compare the extracted group values to
...@@ -621,7 +626,6 @@ class HandlerTest(BaseTest): ...@@ -621,7 +626,6 @@ class HandlerTest(BaseTest):
@unittest.skipIf(os.name == 'nt', 'WatchedFileHandler not appropriate for Windows.') @unittest.skipIf(os.name == 'nt', 'WatchedFileHandler not appropriate for Windows.')
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
@support.reap_threads
def test_race(self): def test_race(self):
# Issue #14632 refers. # Issue #14632 refers.
def remove_loop(fname, tries): def remove_loop(fname, tries):
...@@ -986,7 +990,6 @@ if threading: ...@@ -986,7 +990,6 @@ if threading:
class SMTPHandlerTest(BaseTest): class SMTPHandlerTest(BaseTest):
TIMEOUT = 8.0 TIMEOUT = 8.0
@support.reap_threads
def test_basic(self): def test_basic(self):
sockmap = {} sockmap = {}
server = TestSMTPServer((support.HOST, 0), self.process_message, 0.001, server = TestSMTPServer((support.HOST, 0), self.process_message, 0.001,
...@@ -1466,6 +1469,7 @@ class ConfigFileTest(BaseTest): ...@@ -1466,6 +1469,7 @@ class ConfigFileTest(BaseTest):
self.assertFalse(logger.disabled) self.assertFalse(logger.disabled)
@unittest.skipIf(True, "FIXME: bpo-30830")
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
class SocketHandlerTest(BaseTest): class SocketHandlerTest(BaseTest):
...@@ -1565,6 +1569,7 @@ def _get_temp_domain_socket(): ...@@ -1565,6 +1569,7 @@ def _get_temp_domain_socket():
os.remove(fn) os.remove(fn)
return fn return fn
@unittest.skipIf(True, "FIXME: bpo-30830")
@unittest.skipUnless(hasattr(socket, "AF_UNIX"), "Unix sockets required") @unittest.skipUnless(hasattr(socket, "AF_UNIX"), "Unix sockets required")
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
class UnixSocketHandlerTest(SocketHandlerTest): class UnixSocketHandlerTest(SocketHandlerTest):
...@@ -1583,6 +1588,7 @@ class UnixSocketHandlerTest(SocketHandlerTest): ...@@ -1583,6 +1588,7 @@ class UnixSocketHandlerTest(SocketHandlerTest):
SocketHandlerTest.tearDown(self) SocketHandlerTest.tearDown(self)
support.unlink(self.address) support.unlink(self.address)
@unittest.skipIf(True, "FIXME: bpo-30830")
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
class DatagramHandlerTest(BaseTest): class DatagramHandlerTest(BaseTest):
...@@ -1649,6 +1655,7 @@ class DatagramHandlerTest(BaseTest): ...@@ -1649,6 +1655,7 @@ class DatagramHandlerTest(BaseTest):
self.handled.wait() self.handled.wait()
self.assertEqual(self.log_output, "spam\neggs\n") self.assertEqual(self.log_output, "spam\neggs\n")
@unittest.skipIf(True, "FIXME: bpo-30830")
@unittest.skipUnless(hasattr(socket, "AF_UNIX"), "Unix sockets required") @unittest.skipUnless(hasattr(socket, "AF_UNIX"), "Unix sockets required")
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
class UnixDatagramHandlerTest(DatagramHandlerTest): class UnixDatagramHandlerTest(DatagramHandlerTest):
...@@ -1736,6 +1743,7 @@ class SysLogHandlerTest(BaseTest): ...@@ -1736,6 +1743,7 @@ class SysLogHandlerTest(BaseTest):
self.handled.wait() self.handled.wait()
self.assertEqual(self.log_output, b'<11>h\xc3\xa4m-sp\xc3\xa4m') self.assertEqual(self.log_output, b'<11>h\xc3\xa4m-sp\xc3\xa4m')
@unittest.skipIf(True, "FIXME: bpo-30830")
@unittest.skipUnless(hasattr(socket, "AF_UNIX"), "Unix sockets required") @unittest.skipUnless(hasattr(socket, "AF_UNIX"), "Unix sockets required")
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
class UnixSysLogHandlerTest(SysLogHandlerTest): class UnixSysLogHandlerTest(SysLogHandlerTest):
...@@ -1754,6 +1762,7 @@ class UnixSysLogHandlerTest(SysLogHandlerTest): ...@@ -1754,6 +1762,7 @@ class UnixSysLogHandlerTest(SysLogHandlerTest):
SysLogHandlerTest.tearDown(self) SysLogHandlerTest.tearDown(self)
support.unlink(self.address) support.unlink(self.address)
@unittest.skipIf(True, "FIXME: bpo-30830")
@unittest.skipUnless(support.IPV6_ENABLED, @unittest.skipUnless(support.IPV6_ENABLED,
'IPv6 support required for this test.') 'IPv6 support required for this test.')
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
...@@ -1795,7 +1804,6 @@ class HTTPHandlerTest(BaseTest): ...@@ -1795,7 +1804,6 @@ class HTTPHandlerTest(BaseTest):
request.end_headers() request.end_headers()
self.handled.set() self.handled.set()
@support.reap_threads
def test_output(self): def test_output(self):
# The log message sent to the HTTPHandler is properly received. # The log message sent to the HTTPHandler is properly received.
logger = logging.getLogger("http") logger = logging.getLogger("http")
...@@ -2879,6 +2887,9 @@ class ConfigDictTest(BaseTest): ...@@ -2879,6 +2887,9 @@ class ConfigDictTest(BaseTest):
logging.warning('Exclamation') logging.warning('Exclamation')
self.assertTrue(output.getvalue().endswith('Exclamation!\n')) self.assertTrue(output.getvalue().endswith('Exclamation!\n'))
# listen() uses ConfigSocketReceiver which is based
# on socketserver.ThreadingTCPServer
@unittest.skipIf(True, "FIXME: bpo-30830")
@unittest.skipUnless(threading, 'listen() needs threading to work') @unittest.skipUnless(threading, 'listen() needs threading to work')
def setup_via_listener(self, text, verify=None): def setup_via_listener(self, text, verify=None):
text = text.encode("utf-8") text = text.encode("utf-8")
...@@ -2911,7 +2922,6 @@ class ConfigDictTest(BaseTest): ...@@ -2911,7 +2922,6 @@ class ConfigDictTest(BaseTest):
self.fail("join() timed out") self.fail("join() timed out")
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
@support.reap_threads
def test_listen_config_10_ok(self): def test_listen_config_10_ok(self):
with support.captured_stdout() as output: with support.captured_stdout() as output:
self.setup_via_listener(json.dumps(self.config10)) self.setup_via_listener(json.dumps(self.config10))
...@@ -2932,7 +2942,6 @@ class ConfigDictTest(BaseTest): ...@@ -2932,7 +2942,6 @@ class ConfigDictTest(BaseTest):
], stream=output) ], stream=output)
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
@support.reap_threads
def test_listen_config_1_ok(self): def test_listen_config_1_ok(self):
with support.captured_stdout() as output: with support.captured_stdout() as output:
self.setup_via_listener(textwrap.dedent(ConfigFileTest.config1)) self.setup_via_listener(textwrap.dedent(ConfigFileTest.config1))
...@@ -2948,7 +2957,6 @@ class ConfigDictTest(BaseTest): ...@@ -2948,7 +2957,6 @@ class ConfigDictTest(BaseTest):
self.assert_log_lines([]) self.assert_log_lines([])
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
@support.reap_threads
def test_listen_verify(self): def test_listen_verify(self):
def verify_fail(stuff): def verify_fail(stuff):
...@@ -3232,7 +3240,6 @@ if hasattr(logging.handlers, 'QueueListener'): ...@@ -3232,7 +3240,6 @@ if hasattr(logging.handlers, 'QueueListener'):
handler.close() handler.close()
@patch.object(logging.handlers.QueueListener, 'handle') @patch.object(logging.handlers.QueueListener, 'handle')
@support.reap_threads
def test_handle_called_with_queue_queue(self, mock_handle): def test_handle_called_with_queue_queue(self, mock_handle):
for i in range(self.repeat): for i in range(self.repeat):
log_queue = queue.Queue() log_queue = queue.Queue()
...@@ -3242,7 +3249,6 @@ if hasattr(logging.handlers, 'QueueListener'): ...@@ -3242,7 +3249,6 @@ if hasattr(logging.handlers, 'QueueListener'):
@support.requires_multiprocessing_queue @support.requires_multiprocessing_queue
@patch.object(logging.handlers.QueueListener, 'handle') @patch.object(logging.handlers.QueueListener, 'handle')
@support.reap_threads
def test_handle_called_with_mp_queue(self, mock_handle): def test_handle_called_with_mp_queue(self, mock_handle):
for i in range(self.repeat): for i in range(self.repeat):
log_queue = multiprocessing.Queue() log_queue = multiprocessing.Queue()
...@@ -3261,7 +3267,6 @@ if hasattr(logging.handlers, 'QueueListener'): ...@@ -3261,7 +3267,6 @@ if hasattr(logging.handlers, 'QueueListener'):
return [] return []
@support.requires_multiprocessing_queue @support.requires_multiprocessing_queue
@support.reap_threads
def test_no_messages_in_queue_after_stop(self): def test_no_messages_in_queue_after_stop(self):
""" """
Five messages are logged then the QueueListener is stopped. This Five messages are logged then the QueueListener is stopped. This
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment