12
12
import time
13
13
import shutil
14
14
import unittest
15
+ from unittest import mock
15
16
from test .support import (
16
17
verbose , import_module , run_unittest , TESTFN , reap_threads ,
17
18
forget , unlink , rmtree , start_threads )
@@ -37,6 +38,12 @@ def task(N, done, done_tasks, errors):
37
38
if finished :
38
39
done .set ()
39
40
41
+ def mock_register_at_fork (func ):
42
+ # bpo-30599: Mock os.register_at_fork() when importing the random module,
43
+ # since this function doesn't allow to unregister callbacks and would leak
44
+ # memory.
45
+ return mock .patch ('os.register_at_fork' , create = True )(func )
46
+
40
47
# Create a circular import structure: A -> C -> B -> D -> A
41
48
# NOTE: `time` is already loaded and therefore doesn't threaten to deadlock.
42
49
@@ -97,7 +104,8 @@ def tearDown(self):
97
104
if self .old_random is not None :
98
105
sys .modules ['random' ] = self .old_random
99
106
100
- def check_parallel_module_init (self ):
107
+ @mock_register_at_fork
108
+ def check_parallel_module_init (self , mock_os ):
101
109
if imp .lock_held ():
102
110
# This triggers on, e.g., from test import autotest.
103
111
raise unittest .SkipTest ("can't run when import lock is held" )
@@ -214,7 +222,8 @@ def import_ba():
214
222
t2 .join ()
215
223
self .assertEqual (set (results ), {'a' , 'b' })
216
224
217
- def test_side_effect_import (self ):
225
+ @mock_register_at_fork
226
+ def test_side_effect_import (self , mock_os ):
218
227
code = """if 1:
219
228
import threading
220
229
def target():
0 commit comments