@@ -288,6 +288,48 @@ def test_set_wakeup_fd_socket_result(self):
288288 self .assertEqual (signal .set_wakeup_fd (- 1 ), fd2 )
289289 self .assertEqual (signal .set_wakeup_fd (- 1 ), - 1 )
290290
291+ @unittest .skipUnless (support .has_socket_support , "needs working sockets." )
292+ def test_wakeup_state_and_conditional_update (self ):
293+ first , second = socket .socketpair ()
294+ self .addCleanup (first .close )
295+ self .addCleanup (second .close )
296+ first .setblocking (False )
297+ second .setblocking (False )
298+ self .addCleanup (signal .set_wakeup_fd , - 1 )
299+
300+ initial_state = signal .get_wakeup ()
301+ self .assertEqual (initial_state .fd , - 1 )
302+ self .assertFalse (initial_state .is_socket )
303+ signal .set_wakeup_fd (first .fileno (), warn_on_full_buffer = False )
304+ first_state = signal .get_wakeup ()
305+ self .assertEqual (first_state .fd , first .fileno ())
306+ self .assertFalse (first_state .warn_on_full_buffer )
307+ self .assertEqual (first_state .is_socket , sys .platform == "win32" )
308+
309+ signal .set_wakeup_fd (
310+ first .fileno (),
311+ warn_on_full_buffer = True ,
312+ check_previous = first_state ,
313+ )
314+ changed_state = signal .get_wakeup ()
315+ self .assertEqual (changed_state .fd , first .fileno ())
316+ self .assertTrue (changed_state .warn_on_full_buffer )
317+
318+ with self .assertRaisesRegex (RuntimeError ,
319+ "signal wakeup configuration changed" ):
320+ signal .set_wakeup_fd (second .fileno (), check_previous = first_state )
321+ self .assertEqual (signal .get_wakeup (), changed_state )
322+
323+ signal .set_wakeup_fd (second .fileno (), check_previous = changed_state )
324+ second_state = signal .get_wakeup ()
325+ self .assertEqual (second_state .fd , second .fileno ())
326+ self .assertTrue (second_state .warn_on_full_buffer )
327+
328+ with self .assertRaisesRegex (RuntimeError ,
329+ "signal wakeup configuration changed" ):
330+ signal .set_wakeup_fd (- 1 , check_previous = first_state )
331+ self .assertEqual (signal .get_wakeup (), second_state )
332+
291333 # On Windows, files are always blocking and Windows does not provide a
292334 # function to test if a socket is in non-blocking mode.
293335 @unittest .skipIf (sys .platform == "win32" , "tests specific to POSIX" )
0 commit comments