diff -r 50424a903593 Lib/test/test_logging.py --- a/Lib/test/test_logging.py Fri Jan 06 18:15:51 2017 +0100 +++ b/Lib/test/test_logging.py Fri Jan 06 21:37:06 2017 +0000 @@ -1,4 +1,4 @@ -# Copyright 2001-2016 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2017 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,7 +16,7 @@ """Test harness for the logging module. Run all tests. -Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved. """ import logging @@ -1440,26 +1440,42 @@ """Set up a TCP server to receive log messages, and a SocketHandler pointing to that server's address and port.""" BaseTest.setUp(self) - self.server = server = self.server_class(self.address, - self.handle_socket, 0.01) - server.start() - server.ready.wait() - hcls = logging.handlers.SocketHandler - if isinstance(server.server_address, tuple): - self.sock_hdlr = hcls('localhost', server.port) - else: - self.sock_hdlr = hcls(server.server_address, None) - self.log_output = '' - self.root_logger.removeHandler(self.root_logger.handlers[0]) - self.root_logger.addHandler(self.sock_hdlr) - self.handled = threading.Semaphore(0) + # Issue #29177: deal with errors that happen during setup + self.server = self.sock_hdlr = None + try: + self.server = server = self.server_class(self.address, + self.handle_socket, 0.01) + server.start() + server.ready.wait() + hcls = logging.handlers.SocketHandler + if isinstance(server.server_address, tuple): + self.sock_hdlr = hcls('localhost', server.port) + else: + self.sock_hdlr = hcls(server.server_address, None) + self.log_output = '' + self.root_logger.removeHandler(self.root_logger.handlers[0]) + # Uncomment next line to test error recovery in setUp() + # raise ValueError('dummy error raised') + self.root_logger.addHandler(self.sock_hdlr) + self.handled = threading.Semaphore(0) + except Exception: + if self.server: + self.server.stop(2.0) + self.server = None + if self.sock_hdlr: + # we assume the failure happens before adding the handler, + # so we don't try to remove it here + self.sock_hdlr.close() + self.sock_hdlr = None def tearDown(self): """Shutdown the TCP server.""" try: - self.server.stop(2.0) - self.root_logger.removeHandler(self.sock_hdlr) - self.sock_hdlr.close() + if self.server: + self.server.stop(2.0) + if self.sock_hdlr: + self.root_logger.removeHandler(self.sock_hdlr) + self.sock_hdlr.close() finally: BaseTest.tearDown(self) @@ -1480,6 +1496,8 @@ def test_output(self): # The log message sent to the SocketHandler is properly received. + if not self.server: + self.skipTest('server could not be started') logger = logging.getLogger("tcp") logger.error("spam") self.handled.acquire() @@ -1488,6 +1506,8 @@ self.assertEqual(self.log_output, "spam\neggs\n") def test_noserver(self): + if not self.server: + self.skipTest('server could not be started') # Avoid timing-related failures due to SocketHandler's own hard-wired # one-second timeout on socket.create_connection() (issue #16264). self.sock_hdlr.retryStart = 2.5 @@ -1543,26 +1563,42 @@ """Set up a UDP server to receive log messages, and a DatagramHandler pointing to that server's address and port.""" BaseTest.setUp(self) - self.server = server = self.server_class(self.address, - self.handle_datagram, 0.01) - server.start() - server.ready.wait() - hcls = logging.handlers.DatagramHandler - if isinstance(server.server_address, tuple): - self.sock_hdlr = hcls('localhost', server.port) - else: - self.sock_hdlr = hcls(server.server_address, None) - self.log_output = '' - self.root_logger.removeHandler(self.root_logger.handlers[0]) - self.root_logger.addHandler(self.sock_hdlr) - self.handled = threading.Event() + # Issue #29177: deal with errors that happen during setup + self.server = self.sock_hdlr = None + try: + self.server = server = self.server_class(self.address, + self.handle_datagram, 0.01) + server.start() + server.ready.wait() + hcls = logging.handlers.DatagramHandler + if isinstance(server.server_address, tuple): + self.sock_hdlr = hcls('localhost', server.port) + else: + self.sock_hdlr = hcls(server.server_address, None) + self.log_output = '' + self.root_logger.removeHandler(self.root_logger.handlers[0]) + # Uncomment next line to test error recovery in setUp() + # raise ValueError('dummy error raised') + self.root_logger.addHandler(self.sock_hdlr) + self.handled = threading.Event() + except Exception: + if self.server: + self.server.stop(2.0) + self.server = None + if self.sock_hdlr: + # we assume the failure happens before adding the handler, + # so we don't try to remove it here + self.sock_hdlr.close() + self.sock_hdlr = None def tearDown(self): """Shutdown the UDP server.""" try: - self.server.stop(2.0) - self.root_logger.removeHandler(self.sock_hdlr) - self.sock_hdlr.close() + if self.server: + self.server.stop(2.0) + if self.sock_hdlr: + self.root_logger.removeHandler(self.sock_hdlr) + self.sock_hdlr.close() finally: BaseTest.tearDown(self) @@ -1576,6 +1612,8 @@ def test_output(self): # The log message sent to the DatagramHandler is properly received. + if not self.server: + self.skipTest('server could not be started') logger = logging.getLogger("udp") logger.error("spam") self.handled.wait() @@ -1615,26 +1653,42 @@ """Set up a UDP server to receive log messages, and a SysLogHandler pointing to that server's address and port.""" BaseTest.setUp(self) - self.server = server = self.server_class(self.address, - self.handle_datagram, 0.01) - server.start() - server.ready.wait() - hcls = logging.handlers.SysLogHandler - if isinstance(server.server_address, tuple): - self.sl_hdlr = hcls(('localhost', server.port)) - else: - self.sl_hdlr = hcls(server.server_address) - self.log_output = '' - self.root_logger.removeHandler(self.root_logger.handlers[0]) - self.root_logger.addHandler(self.sl_hdlr) - self.handled = threading.Event() + # Issue #29177: deal with errors that happen during setup + self.server = self.sl_hdlr = None + try: + self.server = server = self.server_class(self.address, + self.handle_datagram, 0.01) + server.start() + server.ready.wait() + hcls = logging.handlers.SysLogHandler + if isinstance(server.server_address, tuple): + self.sl_hdlr = hcls(('localhost', server.port)) + else: + self.sl_hdlr = hcls(server.server_address) + self.log_output = '' + self.root_logger.removeHandler(self.root_logger.handlers[0]) + # Uncomment next line to test error recovery in setUp() + # raise ValueError('dummy error raised') + self.root_logger.addHandler(self.sl_hdlr) + self.handled = threading.Event() + except Exception: + if self.server: + self.server.stop(2.0) + self.server = None + if self.sl_hdlr: + # we assume the failure happens before adding the handler, + # so we don't try to remove it here + self.sl_hdlr.close() + self.sl_hdlr = None def tearDown(self): - """Shutdown the UDP server.""" + """Shutdown the server.""" try: - self.server.stop(2.0) - self.root_logger.removeHandler(self.sl_hdlr) - self.sl_hdlr.close() + if self.server: + self.server.stop(2.0) + if self.sl_hdlr: + self.root_logger.removeHandler(self.sl_hdlr) + self.sl_hdlr.close() finally: BaseTest.tearDown(self) @@ -1643,6 +1697,8 @@ self.handled.set() def test_output(self): + if not self.server: + self.skipTest('server could not be started') # The log message sent to the SysLogHandler is properly received. logger = logging.getLogger("slh") logger.error("sp\xe4m")