Skip to content

Commit 86fe860

Browse files
committed
Fix the threading infrastructure in test_socket to support skipping
tests from the setUp() routine. This fixes a refleak in test_socket on some machines.
1 parent 1ee1b6f commit 86fe860

1 file changed

Lines changed: 14 additions & 10 deletions

File tree

Lib/test/test_socket.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,12 @@ class SocketCANTest(unittest.TestCase):
106106

107107
def setUp(self):
108108
self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
109+
self.addCleanup(self.s.close)
109110
try:
110111
self.s.bind((self.interface,))
111112
except socket.error:
112113
self.skipTest('network interface `%s` does not exist' %
113114
self.interface)
114-
self.s.close()
115-
116-
def tearDown(self):
117-
self.s.close()
118-
self.s = None
119115

120116
class ThreadableTest:
121117
"""Threadable Test class
@@ -174,6 +170,7 @@ def _setUp(self):
174170
self.client_ready = threading.Event()
175171
self.done = threading.Event()
176172
self.queue = queue.Queue(1)
173+
self.server_crashed = False
177174

178175
# Do some munging to start the client test.
179176
methodname = self.id()
@@ -183,8 +180,12 @@ def _setUp(self):
183180
self.client_thread = thread.start_new_thread(
184181
self.clientRun, (test_method,))
185182

186-
self.__setUp()
187-
if not self.server_ready.is_set():
183+
try:
184+
self.__setUp()
185+
except:
186+
self.server_crashed = True
187+
raise
188+
finally:
188189
self.server_ready.set()
189190
self.client_ready.wait()
190191

@@ -200,6 +201,9 @@ def clientRun(self, test_func):
200201
self.server_ready.wait()
201202
self.clientSetUp()
202203
self.client_ready.set()
204+
if self.server_crashed:
205+
self.clientTearDown()
206+
return
203207
if not hasattr(test_func, '__call__'):
204208
raise TypeError("test_func must be a callable function")
205209
try:
@@ -258,9 +262,9 @@ def clientSetUp(self):
258262
try:
259263
self.cli.bind((self.interface,))
260264
except socket.error:
261-
self.skipTest('network interface `%s` does not exist' %
262-
self.interface)
263-
self.cli.close()
265+
# skipTest should not be called here, and will be called in the
266+
# server instead
267+
pass
264268

265269
def clientTearDown(self):
266270
self.cli.close()

0 commit comments

Comments
 (0)