Skip to content

Commit 978fe4a

Browse files
committed
Fixes #29177: Improved resilience of logging tests which use socket servers.
Thanks to Xavier de Gaye for the report and patch improvements.
1 parent 2437afb commit 978fe4a

1 file changed

Lines changed: 62 additions & 24 deletions

File tree

Lib/test/test_logging.py

Lines changed: 62 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2001-2016 by Vinay Sajip. All Rights Reserved.
1+
# Copyright 2001-2017 by Vinay Sajip. All Rights Reserved.
22
#
33
# Permission to use, copy, modify, and distribute this software and its
44
# documentation for any purpose and without fee is hereby granted,
@@ -16,7 +16,7 @@
1616

1717
"""Test harness for the logging module. Run all tests.
1818
19-
Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.
19+
Copyright (C) 2001-2017 Vinay Sajip. All Rights Reserved.
2020
"""
2121

2222
import logging
@@ -1440,9 +1440,17 @@ def setUp(self):
14401440
"""Set up a TCP server to receive log messages, and a SocketHandler
14411441
pointing to that server's address and port."""
14421442
BaseTest.setUp(self)
1443-
self.server = server = self.server_class(self.address,
1444-
self.handle_socket, 0.01)
1445-
server.start()
1443+
# Issue #29177: deal with errors that happen during setup
1444+
self.server = self.sock_hdlr = self.server_exception = None
1445+
try:
1446+
self.server = server = self.server_class(self.address,
1447+
self.handle_socket, 0.01)
1448+
server.start()
1449+
# Uncomment next line to test error recovery in setUp()
1450+
# raise OSError('dummy error raised')
1451+
except OSError as e:
1452+
self.server_exception = e
1453+
return
14461454
server.ready.wait()
14471455
hcls = logging.handlers.SocketHandler
14481456
if isinstance(server.server_address, tuple):
@@ -1457,9 +1465,11 @@ def setUp(self):
14571465
def tearDown(self):
14581466
"""Shutdown the TCP server."""
14591467
try:
1460-
self.server.stop(2.0)
1461-
self.root_logger.removeHandler(self.sock_hdlr)
1462-
self.sock_hdlr.close()
1468+
if self.server:
1469+
self.server.stop(2.0)
1470+
if self.sock_hdlr:
1471+
self.root_logger.removeHandler(self.sock_hdlr)
1472+
self.sock_hdlr.close()
14631473
finally:
14641474
BaseTest.tearDown(self)
14651475

@@ -1480,6 +1490,8 @@ def handle_socket(self, request):
14801490

14811491
def test_output(self):
14821492
# The log message sent to the SocketHandler is properly received.
1493+
if self.server_exception:
1494+
self.skipTest(self.server_exception)
14831495
logger = logging.getLogger("tcp")
14841496
logger.error("spam")
14851497
self.handled.acquire()
@@ -1488,6 +1500,8 @@ def test_output(self):
14881500
self.assertEqual(self.log_output, "spam\neggs\n")
14891501

14901502
def test_noserver(self):
1503+
if self.server_exception:
1504+
self.skipTest(self.server_exception)
14911505
# Avoid timing-related failures due to SocketHandler's own hard-wired
14921506
# one-second timeout on socket.create_connection() (issue #16264).
14931507
self.sock_hdlr.retryStart = 2.5
@@ -1528,7 +1542,7 @@ def setUp(self):
15281542

15291543
def tearDown(self):
15301544
SocketHandlerTest.tearDown(self)
1531-
os.remove(self.address)
1545+
support.unlink(self.address)
15321546

15331547
@unittest.skipUnless(threading, 'Threading required for this test.')
15341548
class DatagramHandlerTest(BaseTest):
@@ -1543,9 +1557,17 @@ def setUp(self):
15431557
"""Set up a UDP server to receive log messages, and a DatagramHandler
15441558
pointing to that server's address and port."""
15451559
BaseTest.setUp(self)
1546-
self.server = server = self.server_class(self.address,
1547-
self.handle_datagram, 0.01)
1548-
server.start()
1560+
# Issue #29177: deal with errors that happen during setup
1561+
self.server = self.sock_hdlr = self.server_exception = None
1562+
try:
1563+
self.server = server = self.server_class(self.address,
1564+
self.handle_datagram, 0.01)
1565+
server.start()
1566+
# Uncomment next line to test error recovery in setUp()
1567+
# raise OSError('dummy error raised')
1568+
except OSError as e:
1569+
self.server_exception = e
1570+
return
15491571
server.ready.wait()
15501572
hcls = logging.handlers.DatagramHandler
15511573
if isinstance(server.server_address, tuple):
@@ -1560,9 +1582,11 @@ def setUp(self):
15601582
def tearDown(self):
15611583
"""Shutdown the UDP server."""
15621584
try:
1563-
self.server.stop(2.0)
1564-
self.root_logger.removeHandler(self.sock_hdlr)
1565-
self.sock_hdlr.close()
1585+
if self.server:
1586+
self.server.stop(2.0)
1587+
if self.sock_hdlr:
1588+
self.root_logger.removeHandler(self.sock_hdlr)
1589+
self.sock_hdlr.close()
15661590
finally:
15671591
BaseTest.tearDown(self)
15681592

@@ -1576,6 +1600,8 @@ def handle_datagram(self, request):
15761600

15771601
def test_output(self):
15781602
# The log message sent to the DatagramHandler is properly received.
1603+
if self.server_exception:
1604+
self.skipTest(self.server_exception)
15791605
logger = logging.getLogger("udp")
15801606
logger.error("spam")
15811607
self.handled.wait()
@@ -1600,7 +1626,7 @@ def setUp(self):
16001626

16011627
def tearDown(self):
16021628
DatagramHandlerTest.tearDown(self)
1603-
os.remove(self.address)
1629+
support.unlink(self.address)
16041630

16051631
@unittest.skipUnless(threading, 'Threading required for this test.')
16061632
class SysLogHandlerTest(BaseTest):
@@ -1615,9 +1641,17 @@ def setUp(self):
16151641
"""Set up a UDP server to receive log messages, and a SysLogHandler
16161642
pointing to that server's address and port."""
16171643
BaseTest.setUp(self)
1618-
self.server = server = self.server_class(self.address,
1619-
self.handle_datagram, 0.01)
1620-
server.start()
1644+
# Issue #29177: deal with errors that happen during setup
1645+
self.server = self.sl_hdlr = self.server_exception = None
1646+
try:
1647+
self.server = server = self.server_class(self.address,
1648+
self.handle_datagram, 0.01)
1649+
server.start()
1650+
# Uncomment next line to test error recovery in setUp()
1651+
# raise OSError('dummy error raised')
1652+
except OSError as e:
1653+
self.server_exception = e
1654+
return
16211655
server.ready.wait()
16221656
hcls = logging.handlers.SysLogHandler
16231657
if isinstance(server.server_address, tuple):
@@ -1630,11 +1664,13 @@ def setUp(self):
16301664
self.handled = threading.Event()
16311665

16321666
def tearDown(self):
1633-
"""Shutdown the UDP server."""
1667+
"""Shutdown the server."""
16341668
try:
1635-
self.server.stop(2.0)
1636-
self.root_logger.removeHandler(self.sl_hdlr)
1637-
self.sl_hdlr.close()
1669+
if self.server:
1670+
self.server.stop(2.0)
1671+
if self.sl_hdlr:
1672+
self.root_logger.removeHandler(self.sl_hdlr)
1673+
self.sl_hdlr.close()
16381674
finally:
16391675
BaseTest.tearDown(self)
16401676

@@ -1643,6 +1679,8 @@ def handle_datagram(self, request):
16431679
self.handled.set()
16441680

16451681
def test_output(self):
1682+
if self.server_exception:
1683+
self.skipTest(self.server_exception)
16461684
# The log message sent to the SysLogHandler is properly received.
16471685
logger = logging.getLogger("slh")
16481686
logger.error("sp\xe4m")
@@ -1675,7 +1713,7 @@ def setUp(self):
16751713

16761714
def tearDown(self):
16771715
SysLogHandlerTest.tearDown(self)
1678-
os.remove(self.address)
1716+
support.unlink(self.address)
16791717

16801718
@unittest.skipUnless(threading, 'Threading required for this test.')
16811719
class HTTPHandlerTest(BaseTest):

0 commit comments

Comments
 (0)