From 38ff03b2fa1a479f95c62362ea3179c1777acbf2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 18 Aug 2017 16:55:52 +0200 Subject: [PATCH 1/3] bpo-30830: test_logging: don't use daemon threads test_logging: * Don't use daemon threads, but regular threads * Replace hardcoded literal constants with a new STOP_TIMEOUT constant. * Fix servers: don't call fail() since the method doesn't exist, but raise directly an AssertionError --- Lib/test/test_logging.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index a91cfd4ccd3964a..545f83adaf50c20 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -68,6 +68,9 @@ except ImportError: pass +STOP_TIMEOUT = 2.0 + + class BaseTest(unittest.TestCase): """Base class for logging tests.""" @@ -643,7 +646,6 @@ def remove_loop(fname, tries): fd, fn = tempfile.mkstemp('.log', 'test_logging-3-') os.close(fd) remover = threading.Thread(target=remove_loop, args=(fn, del_count)) - remover.daemon = True remover.start() h = logging.handlers.WatchedFileHandler(fn, delay=delay) f = logging.Formatter('%(asctime)s: %(levelname)s: %(message)s') @@ -759,11 +761,10 @@ def process_message(self, peer, mailfrom, rcpttos, data): def start(self): """ - Start the server running on a separate daemon thread. + Start the server running on a separate thread. """ self._thread = t = threading.Thread(target=self.serve_forever, args=(self.poll_interval,)) - t.setDaemon(True) t.start() def serve_forever(self, poll_interval): @@ -796,7 +797,7 @@ def stop(self, timeout=None): alive = self._thread.is_alive() self._thread = None if alive: - self.fail("join() timed out") + raise AssertionError("join() timed out") class ControlMixin(object): """ @@ -822,11 +823,10 @@ def __init__(self, handler, poll_interval): def start(self): """ - Create a daemon thread to run the server, and start it. + Create a thread to run the server, and start it. """ self._thread = t = threading.Thread(target=self.serve_forever, args=(self.poll_interval,)) - t.setDaemon(True) t.start() def serve_forever(self, poll_interval): @@ -850,7 +850,7 @@ def stop(self, timeout=None): alive = self._thread.is_alive() self._thread = None if alive: - self.fail("join() timed out") + raise AssertionError("join() timed out") self.server_close() self.ready.clear() @@ -1505,7 +1505,7 @@ def tearDown(self): """Shutdown the TCP server.""" try: if self.server: - self.server.stop(2.0) + self.server.stop(STOP_TIMEOUT) if self.sock_hdlr: self.root_logger.removeHandler(self.sock_hdlr) self.sock_hdlr.close() @@ -1545,7 +1545,7 @@ def test_noserver(self): # one-second timeout on socket.create_connection() (issue #16264). self.sock_hdlr.retryStart = 2.5 # Kill the server - self.server.stop(2.0) + self.server.stop(STOP_TIMEOUT) # The logging call should try to connect, which should fail try: raise RuntimeError('Deliberate mistake') @@ -1622,7 +1622,7 @@ def tearDown(self): """Shutdown the UDP server.""" try: if self.server: - self.server.stop(2.0) + self.server.stop(STOP_TIMEOUT) if self.sock_hdlr: self.root_logger.removeHandler(self.sock_hdlr) self.sock_hdlr.close() @@ -1706,7 +1706,7 @@ def tearDown(self): """Shutdown the server.""" try: if self.server: - self.server.stop(2.0) + self.server.stop(STOP_TIMEOUT) if self.sl_hdlr: self.root_logger.removeHandler(self.sl_hdlr) self.sl_hdlr.close() @@ -1847,7 +1847,7 @@ def test_output(self): self.assertEqual(d['funcName'], ['test_output']) self.assertEqual(d['msg'], [msg]) - self.server.stop(2.0) + self.server.stop(STOP_TIMEOUT) self.root_logger.removeHandler(self.h_hdlr) self.h_hdlr.close() @@ -2891,7 +2891,7 @@ def setup_via_listener(self, text, verify=None): t.ready.clear() try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.settimeout(2.0) + sock.settimeout(STOP_TIMEOUT) sock.connect(('localhost', port)) slen = struct.pack('>L', len(text)) @@ -2904,9 +2904,9 @@ def setup_via_listener(self, text, verify=None): left -= sent sock.close() finally: - t.ready.wait(2.0) + t.ready.wait(STOP_TIMEOUT) logging.config.stopListening() - t.join(2.0) + t.join(STOP_TIMEOUT) if t.is_alive(): self.fail("join() timed out") From 6f13e613a4ba9a7afeb77d030e6138170726986f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 18 Aug 2017 17:03:52 +0200 Subject: [PATCH 2/3] test_logging: wait 60 seconds for thread completion Wait 60 seconds rather than 2 seconds --- Lib/test/test_logging.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 545f83adaf50c20..e03f3018f9960f7 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -68,7 +68,7 @@ except ImportError: pass -STOP_TIMEOUT = 2.0 +STOP_TIMEOUT = 60.0 class BaseTest(unittest.TestCase): From 191bceb11251679551c1fe21441563da31750cec Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 18 Aug 2017 17:33:10 +0200 Subject: [PATCH 3/3] Remove a commented sleep --- Lib/test/test_logging.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index e03f3018f9960f7..d67047fb9a3a52d 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3272,7 +3272,6 @@ def test_no_messages_in_queue_after_stop(self): for i in range(self.repeat): queue = multiprocessing.Queue() self.setup_and_log(queue, '%s_%s' %(self.id(), i)) - # time.sleep(1) items = list(self.get_all_from_queue(queue)) queue.close() queue.join_thread()