@@ -227,6 +227,85 @@ def handler_hup():
227
227
class Test_UV_Signals (_TestSignal , tb .UVTestCase ):
228
228
NEW_LOOP = 'uvloop.new_event_loop()'
229
229
230
+ def test_signals_restore (self ):
231
+ # Test that uvloop restores signals installed with the signals
232
+ # module after the loop is done running.
233
+
234
+ async def runner ():
235
+ PROG = R"""\
236
+ import asyncio
237
+ import uvloop
238
+ import signal
239
+ import time
240
+
241
+ srv = None
242
+
243
+ async def worker():
244
+ global srv
245
+ cb = lambda *args: None
246
+ srv = await asyncio.start_server(cb, '127.0.0.1', 0)
247
+ print('READY', flush=True)
248
+
249
+ def py_handler(signum, frame):
250
+ print('pyhandler', flush=True)
251
+
252
+ def aio_handler():
253
+ print('aiohandler', flush=True)
254
+ loop.stop()
255
+
256
+ signal.signal(signal.SIGUSR1, py_handler)
257
+
258
+ print('step1', flush=True)
259
+ print(input(), flush=True)
260
+ loop = """ + self .NEW_LOOP + """
261
+ loop.add_signal_handler(signal.SIGUSR1, aio_handler)
262
+ asyncio.set_event_loop(loop)
263
+ loop.create_task(worker())
264
+ loop.run_forever()
265
+ print('step3', flush=True)
266
+ print(input(), flush=True)
267
+ """
268
+
269
+ proc = await asyncio .create_subprocess_exec (
270
+ sys .executable , b'-c' , PROG ,
271
+ stdin = subprocess .PIPE ,
272
+ stdout = subprocess .PIPE ,
273
+ stderr = subprocess .PIPE ,
274
+ loop = self .loop )
275
+
276
+ ln = await proc .stdout .readline ()
277
+ self .assertEqual (ln , b'step1\n ' )
278
+
279
+ proc .send_signal (signal .SIGUSR1 )
280
+ ln = await proc .stdout .readline ()
281
+ self .assertEqual (ln , b'pyhandler\n ' )
282
+
283
+ proc .stdin .write (b'test\n ' )
284
+ ln = await proc .stdout .readline ()
285
+ self .assertEqual (ln , b'test\n ' )
286
+
287
+ ln = await proc .stdout .readline ()
288
+ self .assertEqual (ln , b'READY\n ' )
289
+
290
+ proc .send_signal (signal .SIGUSR1 )
291
+ ln = await proc .stdout .readline ()
292
+ self .assertEqual (ln , b'aiohandler\n ' )
293
+
294
+ ln = await proc .stdout .readline ()
295
+ self .assertEqual (ln , b'step3\n ' )
296
+
297
+ proc .send_signal (signal .SIGUSR1 )
298
+ ln = await proc .stdout .readline ()
299
+ self .assertEqual (ln , b'pyhandler\n ' )
300
+
301
+ proc .stdin .write (b'done\n ' )
302
+
303
+ out , err = await proc .communicate ()
304
+ self .assertEqual (out , b'done\n ' )
305
+ self .assertEqual (err , b'' )
306
+
307
+ self .loop .run_until_complete (runner ())
308
+
230
309
231
310
class Test_AIO_Signals (_TestSignal , tb .AIOTestCase ):
232
311
NEW_LOOP = 'asyncio.new_event_loop()'
0 commit comments