3
3
import multiprocessing
4
4
import signal
5
5
import threading
6
+ import unittest
7
+
8
+ import uvloop
6
9
7
10
from uvloop import _testbase as tb
8
11
@@ -32,35 +35,40 @@ class FailedTestError(BaseException):
32
35
pass
33
36
34
37
38
+ def run_server (quin , qout ):
39
+ server_loop = None
40
+
41
+ def server_thread ():
42
+ nonlocal server_loop
43
+ loop = server_loop = uvloop .new_event_loop ()
44
+ asyncio .set_event_loop (loop )
45
+ coro = loop .create_server (EchoServerProtocol , '127.0.0.1' , 0 )
46
+ server = loop .run_until_complete (coro )
47
+ addr = server .sockets [0 ].getsockname ()
48
+ qout .put (addr )
49
+ loop .run_forever ()
50
+ server .close ()
51
+ loop .run_until_complete (server .wait_closed ())
52
+ try :
53
+ loop .close ()
54
+ except Exception as exc :
55
+ print (exc )
56
+ qout .put ('stopped' )
57
+
58
+ thread = threading .Thread (target = server_thread , daemon = True )
59
+ thread .start ()
60
+
61
+ quin .get ()
62
+ server_loop .call_soon_threadsafe (server_loop .stop )
63
+ thread .join (1 )
64
+
65
+
35
66
class TestIssue39Regr (tb .UVTestCase ):
36
67
"""See https://github.com/MagicStack/uvloop/issues/39 for details.
37
68
38
69
Original code to reproduce the bug is by Jim Fulton.
39
70
"""
40
71
41
- def run_server (self , quin , qout ):
42
- def server_thread ():
43
- loop = self .server_loop = self .new_loop ()
44
- coro = loop .create_server (EchoServerProtocol , '127.0.0.1' , 0 )
45
- server = loop .run_until_complete (coro )
46
- addr = server .sockets [0 ].getsockname ()
47
- qout .put (addr )
48
- loop .run_forever ()
49
- server .close ()
50
- loop .run_until_complete (server .wait_closed ())
51
- try :
52
- loop .close ()
53
- except Exception as exc :
54
- print (exc )
55
- qout .put ('stopped' )
56
-
57
- thread = threading .Thread (target = server_thread , daemon = True )
58
- thread .start ()
59
-
60
- quin .get ()
61
- self .server_loop .call_soon_threadsafe (self .server_loop .stop )
62
- thread .join (1 )
63
-
64
72
def on_alarm (self , sig , fr ):
65
73
if self .running :
66
74
raise FailedTestError
@@ -72,19 +80,20 @@ def run_test(self):
72
80
if threaded :
73
81
qin , qout = queue .Queue (), queue .Queue ()
74
82
threading .Thread (
75
- target = self . run_server ,
83
+ target = run_server ,
76
84
args = (qin , qout ),
77
85
daemon = True ).start ()
78
86
else :
79
87
qin = multiprocessing .Queue ()
80
88
qout = multiprocessing .Queue ()
81
89
multiprocessing .Process (
82
- target = self . run_server ,
90
+ target = run_server ,
83
91
args = (qin , qout ),
84
92
daemon = True ).start ()
85
93
86
94
addr = qout .get ()
87
95
loop = self .new_loop ()
96
+ asyncio .set_event_loop (loop )
88
97
loop .create_task (
89
98
loop .create_connection (
90
99
lambda : EchoClientProtocol (loop ),
@@ -96,6 +105,9 @@ def run_test(self):
96
105
finally :
97
106
loop .close ()
98
107
108
+ @unittest .skipIf (
109
+ multiprocessing .get_start_method (False ) == 'spawn' ,
110
+ 'no need to test on macOS where spawn is used instead of fork' )
99
111
def test_issue39_regression (self ):
100
112
signal .signal (signal .SIGALRM , self .on_alarm )
101
113
signal .alarm (5 )
0 commit comments