|
15 | 15 | from unittest import mock |
16 | 16 |
|
17 | 17 | from test import support |
18 | | -from test.support import os_helper |
| 18 | +from test.support import os_helper, warnings_helper |
19 | 19 | from test.support import socket_helper |
20 | 20 | from test.support import wait_process |
21 | 21 | from test.support import hashlib_helper |
@@ -1180,11 +1180,46 @@ async def runner(): |
1180 | 1180 |
|
1181 | 1181 |
|
1182 | 1182 | @support.requires_fork() |
1183 | | -class TestFork(unittest.IsolatedAsyncioTestCase): |
| 1183 | +class TestFork(unittest.TestCase): |
| 1184 | + |
| 1185 | + def test_fork_not_share_current_task(self): |
| 1186 | + loop = object() |
| 1187 | + task = object() |
| 1188 | + asyncio._set_running_loop(loop) |
| 1189 | + self.addCleanup(asyncio._set_running_loop, None) |
| 1190 | + asyncio.tasks._enter_task(loop, task) |
| 1191 | + self.addCleanup(asyncio.tasks._leave_task, loop, task) |
| 1192 | + self.assertIs(asyncio.current_task(), task) |
| 1193 | + r, w = os.pipe() |
| 1194 | + self.addCleanup(os.close, r) |
| 1195 | + self.addCleanup(os.close, w) |
| 1196 | + pid = os.fork() |
| 1197 | + if pid == 0: |
| 1198 | + # child |
| 1199 | + try: |
| 1200 | + asyncio._set_running_loop(loop) |
| 1201 | + current_task = asyncio.current_task() |
| 1202 | + if current_task is None: |
| 1203 | + os.write(w, b'NO TASK') |
| 1204 | + else: |
| 1205 | + os.write(w, b'TASK:' + str(id(current_task)).encode()) |
| 1206 | + except BaseException as e: |
| 1207 | + os.write(w, b'ERROR:' + ascii(e).encode()) |
| 1208 | + finally: |
| 1209 | + asyncio._set_running_loop(None) |
| 1210 | + os._exit(0) |
| 1211 | + else: |
| 1212 | + # parent |
| 1213 | + result = os.read(r, 100) |
| 1214 | + self.assertEqual(result, b'NO TASK') |
| 1215 | + wait_process(pid, exitcode=0) |
1184 | 1216 |
|
1185 | | - async def test_fork_not_share_event_loop(self): |
| 1217 | + def test_fork_not_share_event_loop(self): |
1186 | 1218 | # The forked process should not share the event loop with the parent |
1187 | | - loop = asyncio.get_running_loop() |
| 1219 | + loop = object() |
| 1220 | + asyncio._set_running_loop(loop) |
| 1221 | + self.assertIs(asyncio.get_running_loop(), loop) |
| 1222 | + self.addCleanup(asyncio._set_running_loop, None) |
1188 | 1223 | r, w = os.pipe() |
1189 | 1224 | self.addCleanup(os.close, r) |
1190 | 1225 | self.addCleanup(os.close, w) |
|
0 commit comments