Skip to content

Commit 5eb175c

Browse files
Keep the event loop for doCleanup().
1 parent 4d99db4 commit 5eb175c

File tree

2 files changed

+85
-19
lines changed

2 files changed

+85
-19
lines changed

Lib/unittest/async_case.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -162,19 +162,11 @@ def run(self, result=None):
162162
finally:
163163
self._tearDownAsyncioLoop()
164164

165-
def doCleanups(self):
166-
if self._asyncioTestLoop is None:
167-
self._setupAsyncioLoop()
168-
try:
169-
return super().doCleanups()
170-
finally:
171-
self._tearDownAsyncioLoop()
172-
else:
173-
return super().doCleanups()
174-
175165
def debug(self):
176166
self._setupAsyncioLoop()
177-
try:
178-
super().debug()
179-
finally:
167+
super().debug()
168+
self._tearDownAsyncioLoop()
169+
170+
def __del__(self):
171+
if self._asyncioTestLoop is not None:
180172
self._tearDownAsyncioLoop()

Lib/unittest/test/test_async_case.py

Lines changed: 80 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import asyncio
2+
import gc
23
import unittest
34

45

@@ -90,11 +91,17 @@ async def on_cleanup(self):
9091

9192
events = []
9293
test = Test("test_func")
93-
with self.assertRaises(MyException):
94+
try:
9495
test.debug()
96+
except MyException:
97+
pass
98+
else:
99+
self.fail('Expected a MyException exception')
95100
self.assertEqual(events, ['asyncSetUp'])
96101
test.doCleanups()
97102
self.assertEqual(events, ['asyncSetUp'])
103+
del test
104+
gc.collect()
98105

99106
def test_exception_in_test(self):
100107
class Test(unittest.IsolatedAsyncioTestCase):
@@ -121,11 +128,17 @@ async def on_cleanup(self):
121128

122129
events = []
123130
test = Test("test_func")
124-
with self.assertRaises(MyException):
131+
try:
125132
test.debug()
133+
except MyException:
134+
pass
135+
else:
136+
self.fail('Expected a MyException exception')
126137
self.assertEqual(events, ['asyncSetUp', 'test'])
127138
test.doCleanups()
128139
self.assertEqual(events, ['asyncSetUp', 'test'])
140+
del test
141+
gc.collect()
129142

130143
def test_exception_in_test_after_adding_cleanup(self):
131144
class Test(unittest.IsolatedAsyncioTestCase):
@@ -152,11 +165,17 @@ async def on_cleanup(self):
152165

153166
events = []
154167
test = Test("test_func")
155-
with self.assertRaises(MyException):
168+
try:
156169
test.debug()
170+
except MyException:
171+
pass
172+
else:
173+
self.fail('Expected a MyException exception')
157174
self.assertEqual(events, ['asyncSetUp', 'test'])
158175
test.doCleanups()
159176
self.assertEqual(events, ['asyncSetUp', 'test', 'cleanup'])
177+
del test
178+
gc.collect()
160179

161180
def test_exception_in_tear_down(self):
162181
class Test(unittest.IsolatedAsyncioTestCase):
@@ -183,12 +202,17 @@ async def on_cleanup(self):
183202

184203
events = []
185204
test = Test("test_func")
186-
with self.assertRaises(MyException):
205+
try:
187206
test.debug()
207+
except MyException:
208+
pass
209+
else:
210+
self.fail('Expected a MyException exception')
188211
self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown'])
189212
test.doCleanups()
190213
self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup'])
191-
214+
del test
215+
gc.collect()
192216

193217
def test_exception_in_tear_clean_up(self):
194218
class Test(unittest.IsolatedAsyncioTestCase):
@@ -215,11 +239,17 @@ async def on_cleanup(self):
215239

216240
events = []
217241
test = Test("test_func")
218-
with self.assertRaises(MyException):
242+
try:
219243
test.debug()
244+
except MyException:
245+
pass
246+
else:
247+
self.fail('Expected a MyException exception')
220248
self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup'])
221249
test.doCleanups()
222250
self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup'])
251+
del test
252+
gc.collect()
223253

224254
def test_deprecation_of_return_val_from_test(self):
225255
# Issue 41322 - deprecate return of value!=None from a test
@@ -309,7 +339,51 @@ async def coro():
309339
output = test.run()
310340
self.assertTrue(cancelled)
311341

342+
def test_debug_cleanup_same_loop(self):
343+
class Test(unittest.IsolatedAsyncioTestCase):
344+
async def asyncSetUp(self):
345+
async def coro():
346+
await asyncio.sleep(0)
347+
fut = asyncio.ensure_future(coro())
348+
self.addAsyncCleanup(self.cleanup, fut)
349+
events.append('asyncSetUp')
350+
351+
async def test_func(self):
352+
events.append('test')
353+
raise MyException()
354+
355+
async def asyncTearDown(self):
356+
events.append('asyncTearDown')
357+
358+
async def cleanup(self, fut):
359+
try:
360+
# Raises an exception if in different loop
361+
await asyncio.wait([fut])
362+
events.append('cleanup')
363+
except:
364+
import traceback
365+
traceback.print_exc()
366+
raise
312367

368+
events = []
369+
test = Test("test_func")
370+
result = test.run()
371+
self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup'])
372+
self.assertIn('MyException', result.errors[0][1])
373+
374+
events = []
375+
test = Test("test_func")
376+
try:
377+
test.debug()
378+
except MyException:
379+
pass
380+
else:
381+
self.fail('Expected a MyException exception')
382+
self.assertEqual(events, ['asyncSetUp', 'test'])
383+
test.doCleanups()
384+
self.assertEqual(events, ['asyncSetUp', 'test', 'cleanup'])
385+
del test
386+
gc.collect()
313387

314388

315389
if __name__ == "__main__":

0 commit comments

Comments
 (0)