| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | import asyncio | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  | import contextvars | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  | from test import support | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-22 12:04:36 +02:00
										 |  |  | support.requires_working_socket(module=True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | class MyException(Exception): | 
					
						
							|  |  |  |     pass | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def tearDownModule(): | 
					
						
							|  |  |  |     asyncio.set_event_loop_policy(None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-08 17:49:09 +03:00
										 |  |  | class TestCM: | 
					
						
							|  |  |  |     def __init__(self, ordering, enter_result=None): | 
					
						
							|  |  |  |         self.ordering = ordering | 
					
						
							|  |  |  |         self.enter_result = enter_result | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async def __aenter__(self): | 
					
						
							|  |  |  |         self.ordering.append('enter') | 
					
						
							|  |  |  |         return self.enter_result | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async def __aexit__(self, *exc_info): | 
					
						
							|  |  |  |         self.ordering.append('exit') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class LacksEnterAndExit: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | class LacksEnter: | 
					
						
							|  |  |  |     async def __aexit__(self, *exc_info): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | class LacksExit: | 
					
						
							|  |  |  |     async def __aenter__(self): | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  | VAR = contextvars.ContextVar('VAR', default=()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | class TestAsyncCase(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |     maxDiff = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-24 15:07:20 +03:00
										 |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         # Ensure that IsolatedAsyncioTestCase instances are destroyed before | 
					
						
							|  |  |  |         # starting a new event loop | 
					
						
							| 
									
										
										
										
											2022-08-24 15:07:20 +03:00
										 |  |  |         self.addCleanup(support.gc_collect) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |     def test_full_cycle(self): | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             def setUp(self): | 
					
						
							|  |  |  |                 self.assertEqual(events, []) | 
					
						
							|  |  |  |                 events.append('setUp') | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |                 VAR.set(VAR.get() + ('setUp',)) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             async def asyncSetUp(self): | 
					
						
							|  |  |  |                 self.assertEqual(events, ['setUp']) | 
					
						
							|  |  |  |                 events.append('asyncSetUp') | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |                 VAR.set(VAR.get() + ('asyncSetUp',)) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |                 self.addAsyncCleanup(self.on_cleanup1) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             async def test_func(self): | 
					
						
							|  |  |  |                 self.assertEqual(events, ['setUp', | 
					
						
							|  |  |  |                                           'asyncSetUp']) | 
					
						
							|  |  |  |                 events.append('test') | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |                 VAR.set(VAR.get() + ('test',)) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |                 self.addAsyncCleanup(self.on_cleanup2) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             async def asyncTearDown(self): | 
					
						
							|  |  |  |                 self.assertEqual(events, ['setUp', | 
					
						
							|  |  |  |                                           'asyncSetUp', | 
					
						
							|  |  |  |                                           'test']) | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |                 VAR.set(VAR.get() + ('asyncTearDown',)) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |                 events.append('asyncTearDown') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             def tearDown(self): | 
					
						
							|  |  |  |                 self.assertEqual(events, ['setUp', | 
					
						
							|  |  |  |                                           'asyncSetUp', | 
					
						
							|  |  |  |                                           'test', | 
					
						
							|  |  |  |                                           'asyncTearDown']) | 
					
						
							|  |  |  |                 events.append('tearDown') | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |                 VAR.set(VAR.get() + ('tearDown',)) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |             async def on_cleanup1(self): | 
					
						
							|  |  |  |                 self.assertEqual(events, ['setUp', | 
					
						
							|  |  |  |                                           'asyncSetUp', | 
					
						
							|  |  |  |                                           'test', | 
					
						
							|  |  |  |                                           'asyncTearDown', | 
					
						
							|  |  |  |                                           'tearDown', | 
					
						
							|  |  |  |                                           'cleanup2']) | 
					
						
							|  |  |  |                 events.append('cleanup1') | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |                 VAR.set(VAR.get() + ('cleanup1',)) | 
					
						
							|  |  |  |                 nonlocal cvar | 
					
						
							|  |  |  |                 cvar = VAR.get() | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             async def on_cleanup2(self): | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |                 self.assertEqual(events, ['setUp', | 
					
						
							|  |  |  |                                           'asyncSetUp', | 
					
						
							|  |  |  |                                           'test', | 
					
						
							|  |  |  |                                           'asyncTearDown', | 
					
						
							|  |  |  |                                           'tearDown']) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |                 events.append('cleanup2') | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |                 VAR.set(VAR.get() + ('cleanup2',)) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         events = [] | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |         cvar = () | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         result = test.run() | 
					
						
							|  |  |  |         self.assertEqual(result.errors, []) | 
					
						
							|  |  |  |         self.assertEqual(result.failures, []) | 
					
						
							|  |  |  |         expected = ['setUp', 'asyncSetUp', 'test', | 
					
						
							|  |  |  |                     'asyncTearDown', 'tearDown', 'cleanup2', 'cleanup1'] | 
					
						
							|  |  |  |         self.assertEqual(events, expected) | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |         self.assertEqual(cvar, tuple(expected)) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         events = [] | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |         cvar = () | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         test = Test("test_func") | 
					
						
							|  |  |  |         test.debug() | 
					
						
							|  |  |  |         self.assertEqual(events, expected) | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |         self.assertEqual(cvar, tuple(expected)) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         test.doCleanups() | 
					
						
							|  |  |  |         self.assertEqual(events, expected) | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |         self.assertEqual(cvar, tuple(expected)) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |     def test_exception_in_setup(self): | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def asyncSetUp(self): | 
					
						
							|  |  |  |                 events.append('asyncSetUp') | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |                 self.addAsyncCleanup(self.on_cleanup) | 
					
						
							|  |  |  |                 raise MyException() | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             async def test_func(self): | 
					
						
							|  |  |  |                 events.append('test') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def asyncTearDown(self): | 
					
						
							|  |  |  |                 events.append('asyncTearDown') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def on_cleanup(self): | 
					
						
							|  |  |  |                 events.append('cleanup') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         events = [] | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         result = test.run() | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'cleanup']) | 
					
						
							|  |  |  |         self.assertIs(result.errors[0][0], test) | 
					
						
							|  |  |  |         self.assertIn('MyException', result.errors[0][1]) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         events = [] | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2022-08-24 15:07:20 +03:00
										 |  |  |         self.addCleanup(test._tearDownAsyncioRunner) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         try: | 
					
						
							|  |  |  |             test.debug() | 
					
						
							|  |  |  |         except MyException: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.fail('Expected a MyException exception') | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp']) | 
					
						
							|  |  |  |         test.doCleanups() | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'cleanup']) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |     def test_exception_in_test(self): | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def asyncSetUp(self): | 
					
						
							|  |  |  |                 events.append('asyncSetUp') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def test_func(self): | 
					
						
							|  |  |  |                 events.append('test') | 
					
						
							|  |  |  |                 self.addAsyncCleanup(self.on_cleanup) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |                 raise MyException() | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             async def asyncTearDown(self): | 
					
						
							|  |  |  |                 events.append('asyncTearDown') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def on_cleanup(self): | 
					
						
							|  |  |  |                 events.append('cleanup') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         events = [] | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         result = test.run() | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup']) | 
					
						
							|  |  |  |         self.assertIs(result.errors[0][0], test) | 
					
						
							|  |  |  |         self.assertIn('MyException', result.errors[0][1]) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         events = [] | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2022-08-24 15:07:20 +03:00
										 |  |  |         self.addCleanup(test._tearDownAsyncioRunner) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         try: | 
					
						
							|  |  |  |             test.debug() | 
					
						
							|  |  |  |         except MyException: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.fail('Expected a MyException exception') | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test']) | 
					
						
							|  |  |  |         test.doCleanups() | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'cleanup']) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |     def test_exception_in_tear_down(self): | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def asyncSetUp(self): | 
					
						
							|  |  |  |                 events.append('asyncSetUp') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def test_func(self): | 
					
						
							|  |  |  |                 events.append('test') | 
					
						
							|  |  |  |                 self.addAsyncCleanup(self.on_cleanup) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def asyncTearDown(self): | 
					
						
							|  |  |  |                 events.append('asyncTearDown') | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |                 raise MyException() | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             async def on_cleanup(self): | 
					
						
							|  |  |  |                 events.append('cleanup') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         events = [] | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         result = test.run() | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup']) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         self.assertIs(result.errors[0][0], test) | 
					
						
							|  |  |  |         self.assertIn('MyException', result.errors[0][1]) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         events = [] | 
					
						
							|  |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2022-08-24 15:07:20 +03:00
										 |  |  |         self.addCleanup(test._tearDownAsyncioRunner) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         try: | 
					
						
							|  |  |  |             test.debug() | 
					
						
							|  |  |  |         except MyException: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.fail('Expected a MyException exception') | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown']) | 
					
						
							|  |  |  |         test.doCleanups() | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_exception_in_tear_clean_up(self): | 
					
						
							|  |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def asyncSetUp(self): | 
					
						
							|  |  |  |                 events.append('asyncSetUp') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def test_func(self): | 
					
						
							|  |  |  |                 events.append('test') | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |                 self.addAsyncCleanup(self.on_cleanup1) | 
					
						
							|  |  |  |                 self.addAsyncCleanup(self.on_cleanup2) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             async def asyncTearDown(self): | 
					
						
							|  |  |  |                 events.append('asyncTearDown') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |             async def on_cleanup1(self): | 
					
						
							|  |  |  |                 events.append('cleanup1') | 
					
						
							|  |  |  |                 raise MyException('some error') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def on_cleanup2(self): | 
					
						
							|  |  |  |                 events.append('cleanup2') | 
					
						
							|  |  |  |                 raise MyException('other error') | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         events = [] | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         result = test.run() | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup2', 'cleanup1']) | 
					
						
							|  |  |  |         self.assertIs(result.errors[0][0], test) | 
					
						
							|  |  |  |         self.assertIn('MyException: other error', result.errors[0][1]) | 
					
						
							|  |  |  |         self.assertIn('MyException: some error', result.errors[1][1]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         events = [] | 
					
						
							|  |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2022-08-24 15:07:20 +03:00
										 |  |  |         self.addCleanup(test._tearDownAsyncioRunner) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         try: | 
					
						
							|  |  |  |             test.debug() | 
					
						
							|  |  |  |         except MyException: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.fail('Expected a MyException exception') | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup2']) | 
					
						
							|  |  |  |         test.doCleanups() | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup2', 'cleanup1']) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 14:32:45 -04:00
										 |  |  |     def test_deprecation_of_return_val_from_test(self): | 
					
						
							| 
									
										
										
										
											2022-10-05 03:29:18 +03:00
										 |  |  |         # Issue 41322 - deprecate return of value that is not None from a test | 
					
						
							|  |  |  |         class Nothing: | 
					
						
							|  |  |  |             def __eq__(self, o): | 
					
						
							|  |  |  |                 return o is None | 
					
						
							| 
									
										
										
										
											2021-08-22 14:32:45 -04:00
										 |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def test1(self): | 
					
						
							|  |  |  |                 return 1 | 
					
						
							|  |  |  |             async def test2(self): | 
					
						
							|  |  |  |                 yield 1 | 
					
						
							| 
									
										
										
										
											2022-10-05 03:29:18 +03:00
										 |  |  |             async def test3(self): | 
					
						
							|  |  |  |                 return Nothing() | 
					
						
							| 
									
										
										
										
											2021-08-22 14:32:45 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         with self.assertWarns(DeprecationWarning) as w: | 
					
						
							|  |  |  |             Test('test1').run() | 
					
						
							| 
									
										
										
										
											2022-10-05 03:29:18 +03:00
										 |  |  |         self.assertIn('It is deprecated to return a value that is not None', str(w.warning)) | 
					
						
							| 
									
										
										
										
											2022-04-24 10:23:59 +03:00
										 |  |  |         self.assertIn('test1', str(w.warning)) | 
					
						
							|  |  |  |         self.assertEqual(w.filename, __file__) | 
					
						
							| 
									
										
										
										
											2021-08-22 14:32:45 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         with self.assertWarns(DeprecationWarning) as w: | 
					
						
							|  |  |  |             Test('test2').run() | 
					
						
							| 
									
										
										
										
											2022-10-05 03:29:18 +03:00
										 |  |  |         self.assertIn('It is deprecated to return a value that is not None', str(w.warning)) | 
					
						
							| 
									
										
										
										
											2022-04-24 10:23:59 +03:00
										 |  |  |         self.assertIn('test2', str(w.warning)) | 
					
						
							|  |  |  |         self.assertEqual(w.filename, __file__) | 
					
						
							| 
									
										
										
										
											2021-08-22 14:32:45 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-05 03:29:18 +03:00
										 |  |  |         with self.assertWarns(DeprecationWarning) as w: | 
					
						
							|  |  |  |             Test('test3').run() | 
					
						
							|  |  |  |         self.assertIn('It is deprecated to return a value that is not None', str(w.warning)) | 
					
						
							|  |  |  |         self.assertIn('test3', str(w.warning)) | 
					
						
							|  |  |  |         self.assertEqual(w.filename, __file__) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  |     def test_cleanups_interleave_order(self): | 
					
						
							|  |  |  |         events = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def test_func(self): | 
					
						
							|  |  |  |                 self.addAsyncCleanup(self.on_sync_cleanup, 1) | 
					
						
							|  |  |  |                 self.addAsyncCleanup(self.on_async_cleanup, 2) | 
					
						
							|  |  |  |                 self.addAsyncCleanup(self.on_sync_cleanup, 3) | 
					
						
							|  |  |  |                 self.addAsyncCleanup(self.on_async_cleanup, 4) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def on_sync_cleanup(self, val): | 
					
						
							|  |  |  |                 events.append(f'sync_cleanup {val}') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def on_async_cleanup(self, val): | 
					
						
							|  |  |  |                 events.append(f'async_cleanup {val}') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test = Test("test_func") | 
					
						
							|  |  |  |         test.run() | 
					
						
							|  |  |  |         self.assertEqual(events, ['async_cleanup 4', | 
					
						
							|  |  |  |                                   'sync_cleanup 3', | 
					
						
							|  |  |  |                                   'async_cleanup 2', | 
					
						
							|  |  |  |                                   'sync_cleanup 1']) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-26 09:28:17 -07:00
										 |  |  |     def test_base_exception_from_async_method(self): | 
					
						
							|  |  |  |         events = [] | 
					
						
							|  |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def test_base(self): | 
					
						
							|  |  |  |                 events.append("test_base") | 
					
						
							|  |  |  |                 raise BaseException() | 
					
						
							|  |  |  |                 events.append("not it") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def test_no_err(self): | 
					
						
							|  |  |  |                 events.append("test_no_err") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def test_cancel(self): | 
					
						
							|  |  |  |                 raise asyncio.CancelledError() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test = Test("test_base") | 
					
						
							|  |  |  |         output = test.run() | 
					
						
							|  |  |  |         self.assertFalse(output.wasSuccessful()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test = Test("test_no_err") | 
					
						
							|  |  |  |         test.run() | 
					
						
							|  |  |  |         self.assertEqual(events, ['test_base', 'test_no_err']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test = Test("test_cancel") | 
					
						
							|  |  |  |         output = test.run() | 
					
						
							|  |  |  |         self.assertFalse(output.wasSuccessful()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-16 11:21:08 +03:00
										 |  |  |     def test_cancellation_hanging_tasks(self): | 
					
						
							|  |  |  |         cancelled = False | 
					
						
							|  |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def test_leaking_task(self): | 
					
						
							|  |  |  |                 async def coro(): | 
					
						
							|  |  |  |                     nonlocal cancelled | 
					
						
							|  |  |  |                     try: | 
					
						
							|  |  |  |                         await asyncio.sleep(1) | 
					
						
							|  |  |  |                     except asyncio.CancelledError: | 
					
						
							|  |  |  |                         cancelled = True | 
					
						
							|  |  |  |                         raise | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # Leave this running in the background | 
					
						
							|  |  |  |                 asyncio.create_task(coro()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test = Test("test_leaking_task") | 
					
						
							|  |  |  |         output = test.run() | 
					
						
							|  |  |  |         self.assertTrue(cancelled) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-08 17:49:09 +03:00
										 |  |  |     def test_enterAsyncContext(self): | 
					
						
							|  |  |  |         events = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def test_func(slf): | 
					
						
							|  |  |  |                 slf.addAsyncCleanup(events.append, 'cleanup1') | 
					
						
							|  |  |  |                 cm = TestCM(events, 42) | 
					
						
							|  |  |  |                 self.assertEqual(await slf.enterAsyncContext(cm), 42) | 
					
						
							|  |  |  |                 slf.addAsyncCleanup(events.append, 'cleanup2') | 
					
						
							|  |  |  |                 events.append('test') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test = Test('test_func') | 
					
						
							|  |  |  |         output = test.run() | 
					
						
							|  |  |  |         self.assertTrue(output.wasSuccessful(), output) | 
					
						
							|  |  |  |         self.assertEqual(events, ['enter', 'test', 'cleanup2', 'exit', 'cleanup1']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_enterAsyncContext_arg_errors(self): | 
					
						
							|  |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def test_func(slf): | 
					
						
							|  |  |  |                 with self.assertRaisesRegex(TypeError, 'asynchronous context manager'): | 
					
						
							|  |  |  |                     await slf.enterAsyncContext(LacksEnterAndExit()) | 
					
						
							|  |  |  |                 with self.assertRaisesRegex(TypeError, 'asynchronous context manager'): | 
					
						
							|  |  |  |                     await slf.enterAsyncContext(LacksEnter()) | 
					
						
							|  |  |  |                 with self.assertRaisesRegex(TypeError, 'asynchronous context manager'): | 
					
						
							|  |  |  |                     await slf.enterAsyncContext(LacksExit()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test = Test('test_func') | 
					
						
							|  |  |  |         output = test.run() | 
					
						
							|  |  |  |         self.assertTrue(output.wasSuccessful()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |     def test_debug_cleanup_same_loop(self): | 
					
						
							|  |  |  |         class Test(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             async def asyncSetUp(self): | 
					
						
							|  |  |  |                 async def coro(): | 
					
						
							|  |  |  |                     await asyncio.sleep(0) | 
					
						
							|  |  |  |                 fut = asyncio.ensure_future(coro()) | 
					
						
							|  |  |  |                 self.addAsyncCleanup(self.cleanup, fut) | 
					
						
							|  |  |  |                 events.append('asyncSetUp') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def test_func(self): | 
					
						
							|  |  |  |                 events.append('test') | 
					
						
							|  |  |  |                 raise MyException() | 
					
						
							| 
									
										
										
										
											2021-08-16 11:21:08 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |             async def asyncTearDown(self): | 
					
						
							|  |  |  |                 events.append('asyncTearDown') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def cleanup(self, fut): | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     # Raises an exception if in different loop | 
					
						
							|  |  |  |                     await asyncio.wait([fut]) | 
					
						
							|  |  |  |                     events.append('cleanup') | 
					
						
							|  |  |  |                 except: | 
					
						
							|  |  |  |                     import traceback | 
					
						
							|  |  |  |                     traceback.print_exc() | 
					
						
							|  |  |  |                     raise | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         events = [] | 
					
						
							|  |  |  |         test = Test("test_func") | 
					
						
							|  |  |  |         result = test.run() | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'asyncTearDown', 'cleanup']) | 
					
						
							|  |  |  |         self.assertIn('MyException', result.errors[0][1]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         events = [] | 
					
						
							|  |  |  |         test = Test("test_func") | 
					
						
							| 
									
										
										
										
											2022-08-24 15:07:20 +03:00
										 |  |  |         self.addCleanup(test._tearDownAsyncioRunner) | 
					
						
							| 
									
										
										
										
											2021-09-22 18:43:23 +03:00
										 |  |  |         try: | 
					
						
							|  |  |  |             test.debug() | 
					
						
							|  |  |  |         except MyException: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.fail('Expected a MyException exception') | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test']) | 
					
						
							|  |  |  |         test.doCleanups() | 
					
						
							|  |  |  |         self.assertEqual(events, ['asyncSetUp', 'test', 'cleanup']) | 
					
						
							| 
									
										
										
										
											2020-10-26 09:28:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 21:22:06 +05:30
										 |  |  |     def test_setup_get_event_loop(self): | 
					
						
							|  |  |  |         # See https://github.com/python/cpython/issues/95736 | 
					
						
							|  |  |  |         # Make sure the default event loop is not used | 
					
						
							|  |  |  |         asyncio.set_event_loop(None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         class TestCase1(unittest.IsolatedAsyncioTestCase): | 
					
						
							|  |  |  |             def setUp(self): | 
					
						
							|  |  |  |                 asyncio.get_event_loop_policy().get_event_loop() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             async def test_demo1(self): | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test = TestCase1('test_demo1') | 
					
						
							|  |  |  |         result = test.run() | 
					
						
							|  |  |  |         self.assertTrue(result.wasSuccessful()) | 
					
						
							| 
									
										
										
										
											2019-05-29 12:33:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     unittest.main() |