
    6\h              	       V   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ d dlmZ d dlmZmZ d dlmZ 	 d dlZn# e$ r dZY nw xY w G d dej                  Z ej        e
j        dk    d	           G d
 dej                              Z ej        e
j        dk    d           G d dej                              Z G d dej                  Z ej        e
j        dk    d	           G d dej                              Z  ej         e!ed          d           G d dej                              Z" ej        e
j        dk    d	           ej         e!ed          d           ej#                     ej         e!ed          d           G d dej                                                                  Z$ ej        e
j        dk    d	           ej         e!ed          o e!ed          d           G d  d!ej                                          Z% G d" d#ej                  Z& G d$ d%ej                  Z' G d& d'ej                  Z( G d( d)ej                  Z)d* Z*e+d+k    r ej,                     dS dS ),    N)support)	os_helper)assert_python_okspawn_python)threading_helperc                       e Zd Zd Zd ZdS )GenericTestsc                    t          t                    D ]}t          t          |          }|dv r!|                     |t          j                   =|dv r!|                     |t          j                   b|                    d          r6|                    d          s!|                     |t          j                   |                    d          r@|                     |t          j                   |                     t          j
        d           t          j        t          j        ddd	 t          
          }t          j        |t          j                   t          j        t          j        ddd t          
          }t          j        |t          j                   t          t          dd           }|@t          j        t          j        ddd t          
          }t          j        ||           d S d S )N>   SIG_DFLSIG_IGN>   	SIG_BLOCKSIG_SETMASKSIG_UNBLOCKSIGSIG_CTRL_win32Signalssignalc                     |                                  r+|                     d          o|                     d           p|                     d          S )Nr   r   r   )isupper
startswithnames    :/opt/python-3.11.14/usr/lib/python3.11/test/test_signal.py<lambda>z)GenericTests.test_enums.<locals>.<lambda>*   sO    LLNN Q//O8O8O4O0w//     )sourceHandlersc                 
    | dv S )N)r   r    r   s    r   r   z)GenericTests.test_enums.<locals>.<lambda>4   s    T%;; r   Sigmasksc                 
    | dv S )N)r   r   r   r!   r   s    r   r   z)GenericTests.test_enums.<locals>.<lambda>=   s    )T!T r   )dirr   getattrassertIsInstancer   r"   r   r   assertEqualsysplatformenum_old_convert_IntEnum_test_simple_enum)selfr   sigCheckedSignalsCheckedHandlersr"   CheckedSigmaskss          r   
test_enumszGenericTests.test_enums   s   KK 
	8 
	8D&$''C---%%c6?;;;;DDD%%c6?;;;;'' 80G0G 8%%c6>::::)) 8%%c6>:::  w777+i0 0    	~v~>>>,j(;;  
 	@@@6:t44"0L*hTT!  O
 "?H=====  r   c                     t          t                    D ]Z}t          t          |          }t          j        |          r/t          j        |          s|                     |j        d           [d S )Nr   )r$   r   r%   inspect	isroutine	isbuiltinr'   
__module__)r.   r   values      r   test_functions_module_attrz'GenericTests.test_functions_module_attrB   sq     KK 	= 	=DFD))E '' =0A%0H0H =  !18<<<	= 	=r   N)__name__r8   __qualname__r3   r:   r!   r   r   r	   r	      s3        %> %> %>N= = = = =r   r	   r   zNot valid on Windowsc                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
 ej         eed	          d
          d             Z ej        ej        d           ej                    d                         ZdS )
PosixTestsc                     d S Nr!   r.   argss     r   trivial_signal_handlerz!PosixTests.trivial_signal_handlerM   s    r   c                 6    t          j        | j        |          S r@   )	functoolspartialrC   )r.   arguments     r   create_handler_with_partialz&PosixTests.create_handler_with_partialP   s     !<hGGGr   c                     |                      t          t          j        d           |                      t          t          j        d| j                   |                      t          t          j        d           d S )Ni  )assertRaises
ValueErrorr   	getsignalrC   	strsignalr.   s    r   ,test_out_of_range_signal_number_raises_errorz7PosixTests.test_out_of_range_signal_number_raises_errorS   sf    *f&6===*fmT5	7 	7 	7 	*f&6=====r   c                 h    |                      t          t          j        t          j        d            d S r@   )rJ   	TypeErrorr   SIGUSR1rN   s    r   0test_setting_signal_handler_to_none_raises_errorz;PosixTests.test_setting_signal_handler_to_none_raises_error[   s1    )V] .$	0 	0 	0 	0 	0r   c                    t          j         t           j        | j                  }|                     |t           j                   |                     t          j        t           j                  | j                   t          j         t           j        |           |                     t          j        t           j                  |           d S r@   )r   SIGHUPrC   r&   r   r'   rL   )r.   hups     r   test_getsignalzPosixTests.test_getsignal_   s    mFM4+FGGc6?333)&-884	6 	6 	6fmS))))&-88#>>>>>r   c                 N    G d d          } |            }|                      d|j                   |                     |          }t          j        t          j        |          }|                     |t          j                   |                      t          j        t          j                  |           t          j        t          j        |           |                      t          j        t          j                  |           |                      d|j                   d S )Nc                   $     e Zd Zd Z fdZ xZS )GPosixTests.test_no_repr_is_called_on_signal_handler.<locals>.MyArgumentc                     d| _         d S Nr   )
repr_countrN   s    r   __init__zPPosixTests.test_no_repr_is_called_on_signal_handler.<locals>.MyArgument.__init__k   s    "#r   c                 d    | xj         dz  c_         t                                                      S N   )r]   super__repr__)r.   	__class__s    r   rc   zPPosixTests.test_no_repr_is_called_on_signal_handler.<locals>.MyArgument.__repr__n   s)    1$ww'')))r   )r;   r8   r<   r^   rc   __classcell__)rd   s   @r   
MyArgumentrZ   j   sG        $ $ $* * * * * * * * *r   rf   r   )r'   r]   rH   r   rU   r&   r   rL   )r.   rf   rG   handlerrV   s        r   (test_no_repr_is_called_on_signal_handlerz3PosixTests.test_no_repr_is_called_on_signal_handlerg   s   	* 	* 	* 	* 	* 	* 	* 	* :<<H/000228<<mFM733c6?333)&-88'BBBfmS))))&-88#>>>H/00000r   c                 2   |                      dt          j        t          j                             |                      dt          j        t          j                             |                      dt          j        t          j                             d S )N	Interrupt
TerminatedHangup)assertInr   rM   SIGINTSIGTERMrU   rN   s    r   test_strsignalzPosixTests.test_strsignal}   sk    k6#3FM#B#BCCClF$4V^$D$DEEEh 0 ? ?@@@@@r   c                     t           j                            t                    }t           j                            |d          }t          |           d S )Nzsignalinterproctester.py)ospathdirname__file__joinr   )r.   rt   scripts      r   test_interprocess_signalz#PosixTests.test_interprocess_signal   s?    '//(++g'ABB     r   valid_signalszrequires signal.valid_signalsc                    t          j                    }|                     |t                     |                     t           j        j        |           |                     t           j        j        |           |                     d|           |                     t           j	        |           | 
                    t          |          t           j	                   t          t                     D ]}|                    d          s|dv r|                     |          5  t          t           |          }|                     |d           | 
                    |t           j	                   d d d            n# 1 swxY w Y   d S )Nr   r   >   r   r   r   )r   ry   r&   setrm   r   rn   SIGALRMassertNotInNSIG
assertLesslenr$   r   subTestr%   assertGreaterEqual)r.   sr   signums       r   test_valid_signalszPosixTests.test_valid_signals   s   
  ""a%%%fn+Q///fn,a000Aa(((A,,, KK 		5 		5D??5)) ---4(( 5 5 ..''2224445 5 5 5 5 5 5 5 5 5 5 5 5 5 5		5 		5s   #AE;;E?	E?	sys.executable required.c                     	 t          j        t          j        ddgt           j                  }|                     d|j                   |                     |j        t          j
                    d S )N-czaimport os, signal, time
os.kill(os.getpid(), signal.SIGINT)
for _ in range(999): time.sleep(0.01)stderr   KeyboardInterrupt)
subprocessrunr(   
executablePIPErm   r   r'   
returncoder   rn   )r.   processs     r   !test_keyboard_interrupt_exit_codez,PosixTests.test_keyboard_interrupt_exit_code   sq     	:.9: "( ( ( 	*GN;;;+fm^<<<<<r   N)r;   r8   r<   rC   rH   rO   rS   rW   rh   rp   rx   unittest
skipUnlesshasattrr   r   r(   r   r   requires_subprocessr   r!   r   r   r>   r>   K   s         H H H> > >0 0 0? ? ?1 1 1,A A A! ! !
 X((' 5 5	 5, X)CDD W ""	= 	= #" ED	= 	= 	=r   r>   zWindows specificc                       e Zd Zd Zd Z ej        ej        d           e	j
                    d                         ZdS )WindowsSignalTestsc                    t          j                    }|                     |t                     |                     t          |          d           |                     t           j        j        |           | 	                    d|           | 	                    t           j
        |           |                     t          |          t           j
                   d S )N   r   )r   ry   r&   r{   r   r   rm   r   rn   r}   r~   r   r.   r   s     r   r   z%WindowsSignalTests.test_valid_signals   s     ""a%%%A***fn+Q///Aa(((A,,,,,r   c                    d }t                      }t          j        t          j        t          j        t          j        t          j        t          j        t          j        fD ]S}t          j	        |          =t          j        |t          j        ||                     |
                    |           T|                     |           |                     t                    5  t          j        d|           d d d            n# 1 swxY w Y   |                     t                    5  t          j        d|           d d d            d S # 1 swxY w Y   d S )Nc                     d S r@   r!   )xys     r   r   z3WindowsSignalTests.test_issue9324.<locals>.<lambda>   s    t r      )r{   r   SIGABRTSIGBREAKSIGFPESIGILLrn   SIGSEGVro   rL   add
assertTruerJ   rK   )r.   rg   checkedr/   s       r   test_issue9324z!WindowsSignalTests.test_issue9324   s   ##%%NFOV]M6=&.N$ 	! 	!C
 $$0c6=g#>#>???C      z** 	' 	'M"g&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' z** 	& 	&M!W%%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&s$   $DD
D
+EEEr   c                     	 t          j        t          j        ddgt           j                  }|                     d|j                   d}|                     |j        |           d S )Nr   zraise KeyboardInterruptr   r   l   :   )	r   r   r(   r   r   rm   r   r'   r   )r.   r   STATUS_CONTROL_C_EXITs      r   r   z4WindowsSignalTests.test_keyboard_interrupt_exit_code   sq     	N
 .'@A!( ( ( 	*GN;;; *+-BCCCCCr   N)r;   r8   r<   r   r   r   r   r(   r   r   r   r   r!   r   r   r   r      s|        - - -& & &* X)CDD W ""D D #" EDD D Dr   r   c                      e Zd Zd Zd Z ej        ej        d          d             Z	 ej
        ej        d           ej         eed          d          d                         Z ej
        ej        d           ej        ej        d          d	                         Z ej
        ej        d
k    d           ej
        ej        d           ej         eed          d          d                                     ZdS )WakeupFDTestsc                 L   |                      t                    5  t          j        t          j                   d d d            n# 1 swxY w Y   |                      t                    5  t          j        t          j        d           d d d            d S # 1 swxY w Y   d S )N)r   F)rJ   rQ   r   set_wakeup_fdrn   rN   s    r   test_invalid_callzWakeupFDTests.test_invalid_call   s   y)) 	7 	7 6666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 y)) 	7 	7 666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s#    AAA, BB Bc                     t          j                    }|                     t          t          ft
          j        |           d S r@   )r   make_bad_fdrJ   rK   OSErrorr   r   )r.   fds     r   test_invalid_fdzWakeupFDTests.test_invalid_fd   sA    "$$:w/ .	4 	4 	4 	4 	4r   zneeds working sockets.c                     t          j                     }|                                }|                                 |                     t          t
          ft          j        |           d S r@   )socketfilenocloserJ   rK   r   r   r   )r.   sockr   s      r   test_invalid_socketz!WakeupFDTests.test_invalid_socket   sX    }[[]]

:w/ .	4 	4 	4 	4 	4r   zEmscripten cannot fstat pipes.piperequires os.pipe()c                    t          j                    \  }}|                     t           j        |           |                     t           j        |           t          j                    \  }}|                     t           j        |           |                     t           j        |           t	          t           d          r*t          j        |d           t          j        |d           t          j        |           |                     t          j        |          |           |                     t          j        d          |           |                     t          j        d          d           d S )Nset_blockingFr   )	rr   r   
addCleanupr   r   r   r   r   r'   )r.   r1w1r2w2s        r   test_set_wakeup_fd_resultz'WakeupFDTests.test_set_wakeup_fd_result   s*    B"%%%"%%%B"%%%"%%%2~&& 	'OB&&&OB&&&R   -b112666-b112666-b11266666r   c                 v   t          j                     }|                     |j                   |                    d           |                                }t          j                     }|                     |j                   |                    d           |                                }t          j        |           |                     t          j        |          |           |                     t          j        d          |           |                     t          j        d          d           d S )NFr   )r   r   r   setblockingr   r   r   r'   )r.   sock1fd1sock2fd2s        r    test_set_wakeup_fd_socket_resultz.WakeupFDTests.test_set_wakeup_fd_socket_result  s     $$$%   llnn$$$%   llnnS!!!-c22C888-b113777-b11266666r   r   ztests specific to POSIXc                 8   t          j                    \  }}|                     t           j        |           |                     t           j        |           t          j        |d           |                     t                    5 }t          j        |           d d d            n# 1 swxY w Y   | 	                    t          |j                  d|z             t          j        |d           t          j        |           t          j        d           d S )NTz&the fd %s must be in non-blocking modeFr   )rr   r   r   r   r   rJ   rK   r   r   r'   str	exception)r.   rfdwfdcms       r   test_set_wakeup_fd_blockingz)WakeupFDTests.test_set_wakeup_fd_blocking&  s5    799S#&&&#&&& 	T"""z** 	&b %%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&R\**ACG	I 	I 	I 	U###S!!!R     s   B''B+.B+N)r;   r8   r<   r   r   r   r   r   has_socket_supportr   skipIfis_emscriptenr   rr   r   r   r(   r)   r   r!   r   r   r   r      s       7 7 74 4 4
 X35MNN4 4 ON4 X_W*,LMMXV,,.BCC7 7 DC NM7" X_W*,LMMX35MNN7 7 ON NM7$ X_S\W,.GHHX_W*,LMMXV,,.BCC! ! DC NM IH! ! !r   r   c                       e Zd Z ej        edu d          ddd            Z ej        edu d           ej         ee	d          d          d                         Z
d	 Zd
 Zd Z ej         eed          d          d             ZdS )WakeupSignalTestsNneed _testcapiTorderedc                    d                     t          t          t          |                    ||          }t	          d|           d S )Na  if 1:
        import _testcapi
        import os
        import signal
        import struct

        signals = {!r}

        def handler(signum, frame):
            pass

        def check_signum(signals):
            data = os.read(read, len(signals)+1)
            raised = struct.unpack('%uB' % len(data), data)
            if not {!r}:
                raised = set(raised)
                signals = set(signals)
            if raised != signals:
                raise Exception("%r != %r" % (raised, signals))

        {}

        signal.signal(signal.SIGALRM, handler)
        read, write = os.pipe()
        os.set_blocking(write, False)
        signal.set_wakeup_fd(write)

        test()
        check_signum(signals)

        os.close(read)
        os.close(write)
        r   )formattuplemapintr   )r.   	test_bodyr   signalscodes        r   check_wakeupzWakeupSignalTests.check_wakeup=  sL     @ F5S'**++Wi@@A 	D 	t$$$$$r   r   r   c                 z   d}t          j                    \  }}	 t          j        |d           |                     d           n# t          $ r Y nw xY wt          j        |           t          j        |           n-# t          j        |           t          j        |           w xY wt          d|           d S )Na&  if 1:
        import _testcapi
        import errno
        import os
        import signal
        import sys
        from test.support import captured_stderr

        def handler(signum, frame):
            1/0

        signal.signal(signal.SIGALRM, handler)
        r, w = os.pipe()
        os.set_blocking(r, False)

        # Set wakeup_fd a read-only file descriptor to trigger the error
        signal.set_wakeup_fd(r)
        try:
            with captured_stderr() as err:
                signal.raise_signal(signal.SIGALRM)
        except ZeroDivisionError:
            # An ignored exception should have been printed out on stderr
            err = err.getvalue()
            if ('Exception ignored when trying to write to the signal wakeup fd'
                not in err):
                raise AssertionError(err)
            if ('OSError: [Errno %d]' % errno.EBADF) not in err:
                raise AssertionError(err)
        else:
            raise AssertionError("ZeroDivisionError not raised")

        os.close(r)
        os.close(w)
           xz9OS doesn't report write() error on the read end of a piper   )rr   r   writeskipTestr   r   r   )r.   r   rws       r   test_wakeup_write_errorz)WakeupSignalTests.test_wakeup_write_errord  s    !D wyy1	HQ MMUVVVV  	 	 	D	
 HQKKKHQKKKK HQKKKHQKKKKt$$$$$s(   A A> 
AA> AA> >*B(c                 F    |                      dt          j                   d S )Na  def test():
            import select
            import time

            TIMEOUT_FULL = 10
            TIMEOUT_HALF = 5

            class InterruptSelect(Exception):
                pass

            def handler(signum, frame):
                raise InterruptSelect
            signal.signal(signal.SIGALRM, handler)

            signal.alarm(1)

            # We attempt to get a signal during the sleep,
            # before select is called
            try:
                select.select([], [], [], TIMEOUT_FULL)
            except InterruptSelect:
                pass
            else:
                raise Exception("select() was not interrupted")

            before_time = time.monotonic()
            select.select([read], [], [], TIMEOUT_FULL)
            after_time = time.monotonic()
            dt = after_time - before_time
            if dt >= TIMEOUT_HALF:
                raise Exception("%s >= %s" % (dt, TIMEOUT_HALF))
        r   r   r|   rN   s    r   test_wakeup_fd_earlyz&WakeupSignalTests.test_wakeup_fd_early  s0     > ^?	 	 	 	 	r   c                 F    |                      dt          j                   d S )Na`  def test():
            import select
            import time

            TIMEOUT_FULL = 10
            TIMEOUT_HALF = 5

            class InterruptSelect(Exception):
                pass

            def handler(signum, frame):
                raise InterruptSelect
            signal.signal(signal.SIGALRM, handler)

            signal.alarm(1)
            before_time = time.monotonic()
            # We attempt to get a signal during the select call
            try:
                select.select([read], [], [], TIMEOUT_FULL)
            except InterruptSelect:
                pass
            else:
                raise Exception("select() was not interrupted")
            after_time = time.monotonic()
            dt = after_time - before_time
            if dt >= TIMEOUT_HALF:
                raise Exception("%s >= %s" % (dt, TIMEOUT_HALF))
        r   rN   s    r   test_wakeup_fd_duringz'WakeupSignalTests.test_wakeup_fd_during  s0     6 ^7	 	 	 	 	r   c                 \    |                      dt          j        t          j                   d S )Nzdef test():
            signal.signal(signal.SIGUSR1, handler)
            signal.raise_signal(signal.SIGUSR1)
            signal.raise_signal(signal.SIGALRM)
        )r   r   rR   r|   rN   s    r   test_signumzWakeupSignalTests.test_signum  s4      ^V^		- 	- 	- 	- 	-r   pthread_sigmaskneed signal.pthread_sigmask()c                 `    |                      dt          j        t          j        d           d S )Na  def test():
            signum1 = signal.SIGUSR1
            signum2 = signal.SIGUSR2

            signal.signal(signum1, handler)
            signal.signal(signum2, handler)

            signal.pthread_sigmask(signal.SIG_BLOCK, (signum1, signum2))
            signal.raise_signal(signum1)
            signal.raise_signal(signum2)
            # Unblocking the 2 signals calls the C signal handler twice
            signal.pthread_sigmask(signal.SIG_UNBLOCK, (signum1, signum2))
        Fr   )r   r   rR   SIGUSR2rN   s    r   test_pendingzWakeupSignalTests.test_pending  s=     	  nfne 	 	= 	= 	= 	= 	=r   )r;   r8   r<   r   r   	_testcapir   r   r   rr   r   r   r   r   r   r   r!   r   r   r   r   ;  s       X_Y$&(8998< $% $% $% $% :9$%L X_Y$&(899XV,,.BCC1% 1% DC :91%f     D  <- - - X):;;8: := =: := = =r   r   
socketpairzneed socket.socketpairc                       e Zd Z ej        edu d          d             Z ej        edu d          d             Z ej        edu d          d             ZdS )WakeupSocketSignalTestsNr   c                 *    d}t          d|           d S )Na  if 1:
        import signal
        import socket
        import struct
        import _testcapi

        signum = signal.SIGINT
        signals = (signum,)

        def handler(signum, frame):
            pass

        signal.signal(signum, handler)

        read, write = socket.socketpair()
        write.setblocking(False)
        signal.set_wakeup_fd(write.fileno())

        signal.raise_signal(signum)

        data = read.recv(1)
        if not data:
            raise Exception("no signum written")
        raised = struct.unpack('B', data)
        if raised != signals:
            raise Exception("%r != %r" % (raised, signals))

        read.close()
        write.close()
        r   r   r.   r   s     r   test_socketz#WakeupSocketSignalTests.test_socket  s!    > 	t$$$$$r   c                 |    t           j        dk    rd}nd}d                    |          }t          d|           d S )Nntsendr   a+  if 1:
        import errno
        import signal
        import socket
        import sys
        import time
        import _testcapi
        from test.support import captured_stderr

        signum = signal.SIGINT

        def handler(signum, frame):
            pass

        signal.signal(signum, handler)

        read, write = socket.socketpair()
        read.setblocking(False)
        write.setblocking(False)

        signal.set_wakeup_fd(write.fileno())

        # Close sockets: send() will fail
        read.close()
        write.close()

        with captured_stderr() as err:
            signal.raise_signal(signum)

        err = err.getvalue()
        if ('Exception ignored when trying to {action} to the signal wakeup fd'
            not in err):
            raise AssertionError(err)
        actionr   rr   r   r   r   r.   r  r   s      r   test_send_errorz'WakeupSocketSignalTests.test_send_error  sQ     7d??FFF!B F&F!!C 	D 	t$$$$$r   c                 |    t           j        dk    rd}nd}d                    |          }t          d|           d S )Nr  r  r   aJ  if 1:
        import errno
        import signal
        import socket
        import sys
        import time
        import _testcapi
        from test.support import captured_stderr

        signum = signal.SIGINT

        # This handler will be called, but we intentionally won't read from
        # the wakeup fd.
        def handler(signum, frame):
            pass

        signal.signal(signum, handler)

        read, write = socket.socketpair()

        # Fill the socketpair buffer
        if sys.platform == 'win32':
            # bpo-34130: On Windows, sometimes non-blocking send fails to fill
            # the full socketpair buffer, so use a timeout of 50 ms instead.
            write.settimeout(0.050)
        else:
            write.setblocking(False)

        written = 0
        if sys.platform == "vxworks":
            CHUNK_SIZES = (1,)
        else:
            # Start with large chunk size to reduce the
            # number of send needed to fill the buffer.
            CHUNK_SIZES = (2 ** 16, 2 ** 8, 1)
        for chunk_size in CHUNK_SIZES:
            chunk = b"x" * chunk_size
            try:
                while True:
                    write.send(chunk)
                    written += chunk_size
            except (BlockingIOError, TimeoutError):
                pass

        print(f"%s bytes written into the socketpair" % written, flush=True)

        write.setblocking(False)
        try:
            write.send(b"x")
        except BlockingIOError:
            # The socketpair buffer seems full
            pass
        else:
            raise AssertionError("%s bytes failed to fill the socketpair "
                                 "buffer" % written)

        # By default, we get a warning when a signal arrives
        msg = ('Exception ignored when trying to {action} '
               'to the signal wakeup fd')
        signal.set_wakeup_fd(write.fileno())

        with captured_stderr() as err:
            signal.raise_signal(signum)

        err = err.getvalue()
        if msg not in err:
            raise AssertionError("first set_wakeup_fd() test failed, "
                                 "stderr: %r" % err)

        # And also if warn_on_full_buffer=True
        signal.set_wakeup_fd(write.fileno(), warn_on_full_buffer=True)

        with captured_stderr() as err:
            signal.raise_signal(signum)

        err = err.getvalue()
        if msg not in err:
            raise AssertionError("set_wakeup_fd(warn_on_full_buffer=True) "
                                 "test failed, stderr: %r" % err)

        # But not if warn_on_full_buffer=False
        signal.set_wakeup_fd(write.fileno(), warn_on_full_buffer=False)

        with captured_stderr() as err:
            signal.raise_signal(signum)

        err = err.getvalue()
        if err != "":
            raise AssertionError("set_wakeup_fd(warn_on_full_buffer=False) "
                                 "test failed, stderr: %r" % err)

        # And then check the default again, to make sure warn_on_full_buffer
        # settings don't leak across calls.
        signal.set_wakeup_fd(write.fileno())

        with captured_stderr() as err:
            signal.raise_signal(signum)

        err = err.getvalue()
        if msg not in err:
            raise AssertionError("second set_wakeup_fd() test failed, "
                                 "stderr: %r" % err)

        r  r   r  r  s      r   test_warn_on_full_bufferz0WakeupSocketSignalTests.test_warn_on_full_bufferD  sR     7d??FFFgN F&F!!O 	P 	t$$$$$r   )	r;   r8   r<   r   r   r   r   r  r
  r!   r   r   r   r     s         X_Y$&(899!% !% :9!%F X_Y$&(899(% (% :9(%T X_Y$&(899n% n% :9n% n% n%r   r   siginterruptzneeds signal.siginterrupt()r   r   c                   R    e Zd Zd Zd Zd Z ej        d          d             ZdS )SiginterruptTestc                    d|d}t          d|          5 }	 |j                                        }|                    t          j                  \  }}||z   }|                                }|dvrt          d|d|          |dk    cd d d            S # t          j	        $ r# |
                                 Y d d d            d	S w xY w# 1 swxY w Y   d S )
Nzif 1:
            import errno
            import os
            import signal
            import sys

            interrupt = aq  
            r, w = os.pipe()

            def handler(signum, frame):
                1 / 0

            signal.signal(signal.SIGALRM, handler)
            if interrupt is not None:
                signal.siginterrupt(signal.SIGALRM, interrupt)

            print("ready")
            sys.stdout.flush()

            # run the test twice
            try:
                for loop in range(2):
                    # send a SIGALRM in a second (during the read)
                    signal.alarm(1)
                    try:
                        # blocking call: read from a pipe without data
                        os.read(r, 1)
                    except ZeroDivisionError:
                        pass
                    else:
                        sys.exit(2)
                sys.exit(3)
            finally:
                os.close(r)
                os.close(w)
        r   )timeout)      Child error (exit code ): r  F)r   stdoutreadlinecommunicater   SHORT_TIMEOUTwait	Exceptionr   TimeoutExpiredkill)r.   	interruptr   r   
first_liner  r   exitcodes           r   readpipe_interruptedz%SiginterruptTest.readpipe_interrupted  si   	R yyG#H $%% 	''$^4466
!(!4!4W=R!4!S!S
 $f,"<<>>6))#)'/xx%9 : : : A	' 	' 	' 	' 	' 	' 	' 	' ,   	' 	' 	' 	' 	' 	' 	' 	'	' 	' 	' 	' 	' 	' 	' 	' 	' 	's4   C<B7C#C<C
CCCCc                 Z    |                      d           }|                     |           d S r@   r  r   r.   interrupteds     r   test_without_siginterruptz*SiginterruptTest.test_without_siginterrupt  /     //55$$$$$r   c                 Z    |                      d          }|                     |           d S NTr!  r"  s     r   test_siginterrupt_onz%SiginterruptTest.test_siginterrupt_on  r%  r   walltimec                 Z    |                      d          }|                     |           d S )NF)r  assertFalser"  s     r   test_siginterrupt_offz&SiginterruptTest.test_siginterrupt_off  s1    
 //66%%%%%r   N)	r;   r8   r<   r  r$  r(  r   requires_resourcer,  r!   r   r   r  r    sk        :' :' :'x% % %% % % Wz**& & +*& & &r   r  	getitimer	setitimerz/needs signal.getitimer() and signal.setitimer()c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	 e
j        ej        dv d	          d
             Zd Zd ZdS )
ItimerTestc                     d| _         d| _        d | _        t          j        t          j        | j                  | _        d S )NFr   )hndl_called
hndl_countitimerr   r|   sig_alrm	old_alarmrN   s    r   setUpzItimerTest.setUp  s3     v~t}EEr   c                     t          j         t           j        | j                   | j        t          j        | j        d           d S d S r\   )r   r|   r7  r5  r/  rN   s    r   tearDownzItimerTest.tearDown  sC    fndn555;"T[!,,,,, #"r   c                     d| _         d S r'  )r3  rA   s     r   r6  zItimerTest.sig_alrm  s    r   c                     d| _         | j        dk    rt          j        d          | j        dk    rt          j        t          j        d           | xj        dz  c_        d S )NTr  z.setitimer didn't disable ITIMER_VIRTUAL timer.r   ra   )r3  r4  r   ItimerErrorr/  ITIMER_VIRTUALrA   s     r   
sig_vtalrmzItimerTest.sig_vtalrm"  sh    ?Q$ &   _!!V2A6661r   c                 R    d| _         t          j        t          j        d           d S )NTr   )r3  r   r/  ITIMER_PROFrA   s     r   sig_profzItimerTest.sig_prof/  s&    +Q/////r   c                 ^    |                      t          j        t          j        dd           d S )Nr   r   )rJ   r   r=  r/  ITIMER_REALrN   s    r   test_itimer_exczItimerTest.test_itimer_exc3  s0     	&,f.>AFFF	H 	Hr   c                     t           j        | _        t          j        | j        d           t          j                     |                     | j        d           d S )Ng      ?T)r   rD  r5  r/  pauser'   r3  rN   s    r   test_itimer_realzItimerTest.test_itimer_real<  sK    (c***)400000r   )netbsd5zDitimer not reliable (does not mix well with threading) on some BSDs.c                    t           j        | _        t          j         t           j        | j                   t          j        | j        dd           t          j        dd          D ]2}t          ddd          }t          j	        | j                  d	k    r n3| 
                    d
           |                     t          j	        | j                  d	           |                     | j        d           d S )Ng333333?皙?      N@Ferror90  2	 铖         rS  8timeout: likely cause: machine too slow or load too highT)r   r>  r5  	SIGVTALRMr?  r/  r   
busy_retrypowr.  r   r'   r3  r.   _s     r   test_itimer_virtualzItimerTest.test_itimer_virtualC  s     +f&888c3///#D666 		" 		"AE5(++A,,
:: ;
 MM ! " " " 	)$+66
CCC)400000r   c                    t           j        | _        t          j         t           j        | j                   t          j        | j        dd           t          j        dd          D ]2}t          ddd          }t          j	        | j                  dk    r n3| 
                    d	           |                     t          j	        | j                  d           |                     | j        d
           d S )NrK  rL  FrM  rO  rP  rQ  rR  rT  T)r   rA  r5  SIGPROFrB  r/  r   rV  rW  r.  r   r'   r3  rX  s     r   test_itimer_profzItimerTest.test_itimer_profZ  s    (fndm444c3///#D666 		" 		"AE5(++A,,
:: ;
 MM ! " " " 	)$+66
CCC)400000r   c                     t           j        | _        t          j        | j        d           t	          j        d           |                     | j        d           d S )Nư>ra   T)r   rD  r5  r/  timesleepr'   r3  rN   s    r   test_setitimer_tinyzItimerTest.test_setitimer_tinyo  sO     (d+++
1)400000r   N)r;   r8   r<   r8  r:  r6  r?  rB  rE  rH  r   r   r(   r)   rZ  r]  rb  r!   r   r   r1  r1    s        F F F- - -       0 0 0H H H1 1 1 X_S\\1NP P1 1P P1*1 1 1*1 1 1 1 1r   r1  c                   t   e Zd Z	  ej         eed          d          d             Z ej         eed          d           ej         eed          d          d                         Z ej         eed          d           e	j
                    d	                         Z ej         eed          d          d
             Z ej         eed          d          d             Z ej         eed          d          d             Z ej         eed          d          d             Z ej         eed          d          d             Z ej         eed          d          d             Z ej         eed          d          d             Z ej         eed          d           ej         eed          d           e	j
                    d                                     Z ej         eed          d          d             Z ej         eed          d          d             Z ej         eed          d           e	j
                    d                         Z ej         eed          d           e	j
                    d                         ZdS )PendingSignalsTests
sigpendingzneed signal.sigpending()c                 l    |                      t          j                    t                                 d S r@   )r'   r   re  r{   rN   s    r   test_sigpending_emptyz)PendingSignalsTests.test_sigpending_empty~  s-     	*,,cee44444r   r   r   c                 *    d}t          d|           d S )Na  if 1:
            import os
            import signal

            def handler(signum, frame):
                1/0

            signum = signal.SIGUSR1
            signal.signal(signum, handler)

            signal.pthread_sigmask(signal.SIG_BLOCK, [signum])
            os.kill(os.getpid(), signum)
            pending = signal.sigpending()
            for sig in pending:
                assert isinstance(sig, signal.Signals), repr(pending)
            if pending != {signum}:
                raise Exception('%s != {%s}' % (pending, signum))
            try:
                signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
            except ZeroDivisionError:
                pass
            else:
                raise Exception("ZeroDivisionError not raised")
        r   r   r   s     r   test_sigpendingz#PendingSignalsTests.test_sigpending  s!    
0 	t$$$$$r   pthread_killzneed signal.pthread_kill()c                 *    d}t          d|           d S )Na  if 1:
            import signal
            import threading
            import sys

            signum = signal.SIGUSR1

            def handler(signum, frame):
                1/0

            signal.signal(signum, handler)

            tid = threading.get_ident()
            try:
                signal.pthread_kill(tid, signum)
            except ZeroDivisionError:
                pass
            else:
                raise Exception("ZeroDivisionError not raised")
        r   r   r   s     r   test_pthread_killz%PendingSignalsTests.test_pthread_kill  s!    ( 	t$$$$$r   c                 \    d|                                 d|d}t          d|           d S )Nzif 1:
        import signal
        import sys
        from signal import Signals

        def handler(signum, frame):
            1/0

        z

        blocked = a  
        signum = signal.SIGALRM

        # child: block and wait the signal
        try:
            signal.signal(signum, handler)
            signal.pthread_sigmask(signal.SIG_BLOCK, [blocked])

            # Do the tests
            test(signum)

            # The handler must not be called on unblock
            try:
                signal.pthread_sigmask(signal.SIG_UNBLOCK, [blocked])
            except ZeroDivisionError:
                print("the signal handler has been called",
                      file=sys.stderr)
                sys.exit(1)
        except BaseException as err:
            print("error: {}".format(err), file=sys.stderr)
            sys.stderr.flush()
            sys.exit(1)
        r   )stripr   )r.   blockedtestr   s       r   wait_helperzPendingSignalsTests.wait_helper  s@    	H zz||||WWWA &J 	t$$$$$r   sigwaitzneed signal.sigwait()c                 F    |                      t          j        d           d S )Na   
        def test(signum):
            signal.alarm(1)
            received = signal.sigwait([signum])
            assert isinstance(received, signal.Signals), received
            if received != signum:
                raise Exception('received %s, not %s' % (received, signum))
        rq  r   r|   rN   s    r   test_sigwaitz PendingSignalsTests.test_sigwait  s/     	 * 	 	 	 	 	r   sigwaitinfozneed signal.sigwaitinfo()c                 F    |                      t          j        d           d S )Nz
        def test(signum):
            signal.alarm(1)
            info = signal.sigwaitinfo([signum])
            if info.si_signo != signum:
                raise Exception("info.si_signo != %s" % signum)
        rt  rN   s    r   test_sigwaitinfoz$PendingSignalsTests.test_sigwaitinfo  /     	 * 	 	 	 	 	r   sigtimedwaitzneed signal.sigtimedwait()c                 F    |                      t          j        d           d S )Nz
        def test(signum):
            signal.alarm(1)
            info = signal.sigtimedwait([signum], 10.1000)
            if info.si_signo != signum:
                raise Exception('info.si_signo != %s' % signum)
        rt  rN   s    r   test_sigtimedwaitz%PendingSignalsTests.test_sigtimedwait  ry  r   c                 F    |                      t          j        d           d S )Nz
        def test(signum):
            import os
            os.kill(os.getpid(), signum)
            info = signal.sigtimedwait([signum], 0)
            if info.si_signo != signum:
                raise Exception('info.si_signo != %s' % signum)
        rt  rN   s    r   test_sigtimedwait_pollz*PendingSignalsTests.test_sigtimedwait_poll  s/     	 * 	 	 	 	 	r   c                 F    |                      t          j        d           d S )Nz
        def test(signum):
            received = signal.sigtimedwait([signum], 1.0)
            if received is not None:
                raise Exception("received=%r" % (received,))
        rt  rN   s    r   test_sigtimedwait_timeoutz-PendingSignalsTests.test_sigtimedwait_timeout  s/     	 * 	 	 	 	 	r   c                 n    t           j        }|                     t          t           j        |gd           d S )Ng      )r   r|   rJ   rK   rz  )r.   r   s     r   "test_sigtimedwait_negative_timeoutz6PendingSignalsTests.test_sigtimedwait_negative_timeout#  s0     *f&9F8TJJJJJr   c                 &    t          dd           d S )Nr   a  if True:
            import os, threading, sys, time, signal

            # the default handler terminates the process
            signum = signal.SIGUSR1

            def kill_later():
                # wait until the main thread is waiting in sigwait()
                time.sleep(1)
                os.kill(os.getpid(), signum)

            # the signal must be blocked by all the threads
            signal.pthread_sigmask(signal.SIG_BLOCK, [signum])
            killer = threading.Thread(target=kill_later)
            killer.start()
            received = signal.sigwait([signum])
            if received != signum:
                print("sigwait() received %s, not %s" % (received, signum),
                      file=sys.stderr)
                sys.exit(1)
            killer.join()
            # unblock the signal, which should have been cleared by sigwait()
            signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
        r   rN   s    r   test_sigwait_threadz'PendingSignalsTests.test_sigwait_thread)  s'     	   	 	 	 	 	r   c                 B   |                      t          t          j                   |                      t          t          j        d           |                      t          t          j        ddd           |                      t          t          j        dg            |                      t
                    5  t          j        t          j        t          j        g           d d d            n# 1 swxY w Y   |                      t
                    5  t          j        t          j        dg           d d d            n# 1 swxY w Y   |                      t
                    5  t          j        t          j        ddz  g           d d d            d S # 1 swxY w Y   d S )Nra   r  r  i  r   i  )rJ   rQ   r   r   r   rK   r   r~   rN   s    r   test_pthread_sigmask_argumentsz2PendingSignalsTests.test_pthread_sigmask_argumentsL  s1    	)V%;<<<)V%;Q???)V%;Q1EEE'6#94DDDz** 	D 	D"6#3fk]CCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Dz** 	: 	:"6#3aS999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:z** 	@ 	@"6#3agY???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s6   5+C,,C03C0!D>>EE#$FFFc                 j   t          j        t           j        t          j                              }|                     t           j        t           j        |           t          j        t           j        t          j                              }|                     |t          j                               d S r@   )r   r   r   ry   r   r   r   assertLessEqualr   s     r   "test_pthread_sigmask_valid_signalsz6PendingSignalsTests.test_pthread_sigmask_valid_signalsZ  s     "6#3V5I5K5KLL.0BAFFF"6#5v7K7M7MNNQ 4 6 677777r   c                 *    d}t          d|           d S )Na-	  if 1:
        import signal
        import os; import threading

        def handler(signum, frame):
            1/0

        def kill(signum):
            os.kill(os.getpid(), signum)

        def check_mask(mask):
            for sig in mask:
                assert isinstance(sig, signal.Signals), repr(sig)

        def read_sigmask():
            sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, [])
            check_mask(sigmask)
            return sigmask

        signum = signal.SIGUSR1

        # Install our signal handler
        old_handler = signal.signal(signum, handler)

        # Unblock SIGUSR1 (and copy the old mask) to test our signal handler
        old_mask = signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
        check_mask(old_mask)
        try:
            kill(signum)
        except ZeroDivisionError:
            pass
        else:
            raise Exception("ZeroDivisionError not raised")

        # Block and then raise SIGUSR1. The signal is blocked: the signal
        # handler is not called, and the signal is now pending
        mask = signal.pthread_sigmask(signal.SIG_BLOCK, [signum])
        check_mask(mask)
        kill(signum)

        # Check the new mask
        blocked = read_sigmask()
        check_mask(blocked)
        if signum not in blocked:
            raise Exception("%s not in %s" % (signum, blocked))
        if old_mask ^ blocked != {signum}:
            raise Exception("%s ^ %s != {%s}" % (old_mask, blocked, signum))

        # Unblock SIGUSR1
        try:
            # unblock the pending signal calls immediately the signal handler
            signal.pthread_sigmask(signal.SIG_UNBLOCK, [signum])
        except ZeroDivisionError:
            pass
        else:
            raise Exception("ZeroDivisionError not raised")
        try:
            kill(signum)
        except ZeroDivisionError:
            pass
        else:
            raise Exception("ZeroDivisionError not raised")

        # Check the new mask
        unblocked = read_sigmask()
        if signum in unblocked:
            raise Exception("%s in %s" % (signum, unblocked))
        if blocked ^ unblocked != {signum}:
            raise Exception("%s ^ %s != {%s}" % (blocked, unblocked, signum))
        if old_mask != unblocked:
            raise Exception("%s != %s" % (old_mask, unblocked))
        r   r   r   s     r   test_pthread_sigmaskz(PendingSignalsTests.test_pthread_sigmaskc  s#    GP 	t$$$$$r   c                     d}t          d|          5 }|                                \  }}|                                }|dk    rt          d|d|          	 d d d            d S # 1 swxY w Y   d S )Na7  if True:
            import threading
            import signal
            import sys

            def handler(signum, frame):
                sys.exit(3)

            signal.signal(signal.SIGUSR1, handler)
            signal.pthread_kill(threading.get_ident(), signal.SIGUSR1)
            sys.exit(2)
        r   r  r  r  )r   r  r  r  )r.   r   r   r  r   r  s         r   test_pthread_kill_main_threadz1PendingSignalsTests.test_pthread_kill_main_thread  s     $%% 	4$0022NFF||~~H1}}i!)66!3 4 4 4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   AA((A,/A,N)r;   r8   r<   r   r   r   r   rg  ri  r   requires_working_threadingrl  rq  ru  rx  r|  r~  r  r  r  r  r  r  r  r!   r   r   rd  rd  y  s        X6635 55 55 55 X):;;8: :X6635 5% %5 5: :%6 X8857 70022% % 327 7%. X):;;8: :*% *%: :*%X X3302 2 2 2 X7746 6 6 6 X8857 7 7 7 X8857 7	 	7 7	 X8857 7 7 7 X8857 7K K7 7K X3302 2X):;;8: :0022  32: :2 2
< X):;;8: :
@ 
@: :
@ X):;;8: :8 8: :8 X):;;8: :0022I% I% 32: :I%V X8857 700224 4 327 74 4 4r   rd  c                   d   e Zd Z	 d Zd Zd Z ej         ee	d          d          d             Z
 ej         ee	d          d          d             Z ej        ej        dk    d	           ej         ee	d
          d           ej                    d                                     ZdS )
StressTestc                 r    t          j         ||          }|                     t           j         ||           d S r@   )r   r   )r.   r   rg   old_handlers       r   setsigzStressTest.setsig  s1    mFG44v{;;;;;r   c                    dg dfd	}|                      t          j        t          j        d           |                     t          j        |            |             t                    k     r't          j        d           t                    k     'fdt          t                    dz
            D             }t          j        |          }t          j        rt          d|fz             |S )	N   c                     t                    k     rG                    t          j                               t	          j        t          j        d           d S d S )Nr_  )r   appendr`  perf_counterr   r/  rD  )r   frameNtimess     r   rg   z5StressTest.measure_itimer_resolution.<locals>.handler  sR    5zzA~~T.00111  !3T::::: ~r   r   gMbP?c                 8    g | ]}|d z            |         z
  S )ra   r!   ).0ir  s     r   
<listcomp>z8StressTest.measure_itimer_resolution.<locals>.<listcomp>  s*    JJJqU1Q3Z%(*JJJr   ra   z,detected median itimer() resolution: %.6f s.NN)r   r   r/  rD  r  r|   r   r`  ra  range
statisticsmedianr   verboseprint)r.   rg   	durationsmedr  r  s       @@r   measure_itimer_resolutionz$StressTest.measure_itimer_resolution  s   	; 	; 	; 	; 	; 	; 	; 	(&*<a@@@FNG,,,			%jj1nnJt %jj1nn KJJJE#e**q.4I4IJJJ		**? 	K@C6IJJJ
r   c                     |                                  }|dk    rdS |dk    rdS |                     d|fz             d S )Ng-C6?i'  g{Gz?d   z^detected itimer resolution (%.3f s.) too high (> 10 ms.) on this platform (or system too busy))r  r   )r.   resos     r   decide_itimer_countzStressTest.decide_itimer_count  sa     --//4<<5T\\3MM M!G$ % % % % %r   r/  ztest needs setitimer()c                 $   	 |                                  }g d }dfd	}|                     t          j        |           |                     t          j        |           |                     t          j        |           d}t          j                    t          j	        z   }||k     rAt          j        t          j                    t          j                   |dz  }t                    |k     rUt          j                    |k     r>t          j        d           t                    |k     rt          j                    |k     >t          j        t          j                    t          j                   |dz  }t                    |k     rUt          j                    |k     r>t          j        d           t                    |k     rt          j                    |k     >||k     A|                     t                    |d           d S )Nc                 r    t          j        t           j        dt          j                    dz  z              d S )Nr_  h㈵>)r   r/  rD  random)r   r  s     r   first_handlerz@StressTest.test_stress_delivery_dependent.<locals>.first_handler  s0     V/$8N1NOOOOOr   c                 2                         |            d S r@   r  r   r  sigss     r   second_handlerzAStressTest.test_stress_delivery_dependent.<locals>.second_handler      KKr   r   ra   r  Some signals were lostr  )r  r  r   r\  rR   r|   r`  	monotonicr   r  rr   r  getpidr   ra  r'   )r.   r  r  r  expected_sigsdeadliner  s         @r   test_stress_delivery_dependentz)StressTest.test_stress_delivery_dependent  s   	 $$&&	P 	P 	P	  	  	  	  	  	  	FNM222FNM222FNN333>##g&;;aGBIKK000QMd))m++0@0@80K0K
4    d))m++0@0@80K0K GBIKK000QMd))m++0@0@80K0K
4    d))m++0@0@80K0K a 	TA'?@@@@@r   c                 j   	 |                                  }g fd}|                     t          j        |           |                     t          j        |           d}||k     rt          j        t          j        dt          j                    dz  z              t          j	        t          j
                    t          j                   |dz  }t          j        t          j        d          D ]}t                    |k    r n||k     |                     t                    |d           d S )	Nc                 2                         |            d S r@   r  r  s     r   rg   z=StressTest.test_stress_delivery_simultaneous.<locals>.handler4  r  r   r   r_  r  r  FrM  r  )r  r  r   rR   r|   r/  rD  r  rr   r  r  r   sleeping_retryr  r   r'   )r.   r  rg   r  rY  r  s        @r   !test_stress_delivery_simultaneousz,StressTest.test_stress_delivery_simultaneous+  s4   	 $$&&	  	  	  	  	  	FNG,,,FNG,,,a V/$8N1NOOOGBIKK000QM+G,AOOO  t99--E . a 	TA'?@@@@@r   darwinz&crashes due to system bug (FB13453490)rR   ztest needs SIGUSR1c                 4  	
 t           j        d
d	d	fd
fd}	
fd}t          j                   }|                     t           j         |           t          j        |          }	 d}t          j                    5 }|                                  |             d|                                 |j	        Y| 
                    |j	        j        t                     |                     dd	d
t          |j	        j                             d}d d d            n# 1 swxY w Y   |s|                     	d           |                     	
           d|                                 d S # d|                                 w xY w)Nr   Fc                     dz  d S r`   r!   )r   r  num_received_signalss     r   custom_handlerzAStressTest.test_stress_modifying_handlers.<locals>.custom_handlerV  s     A%   r   c                  F     st          j                   dz   d S d S r`   )r   raise_signal)do_stopnum_sent_signalsr   s   r   set_interruptszAStressTest.test_stress_modifying_handlers.<locals>.set_interruptsZ  sE     &#F+++ A%   & & & & &r   c                      dk     sdk     rFt          d          D ](} t          j        fD ]}t          j        |           )dk     >dk     Dd S d S )Nr  ra   i N  )r  r   r   )r  rg   r  r  r  r   s     r   cycle_handlerszAStressTest.test_stress_modifying_handlers.<locals>.cycle_handlers`  s    "S((,@1,D,Du 7 7A$2FN#C 7 7fg66667 #S((,@1,D,D,D,D,D,Dr   )targetTzSignal dz ignored due to race condition)r   rR   r   	threadingThreadr   catch_unraisable_exceptionstartrv   
unraisabler&   	exc_valuer   rm   r   assertGreaterr  )r.   r  r  r  tignoredr   r  r  r  r  r   s          @@@@@r   test_stress_modifying_handlersz)StressTest.test_stress_modifying_handlersK  s'     	& 	& 	& 	& 	&	& 	& 	& 	& 	& 	& 	&	7 	7 	7 	7 	7 	7 	7 	7 mFN;;v{;;;N333	G355 #			   =, ))"-*A7KKKMMJ&JJJJBM3446 6 6 #G# # # # # # # # # # # # # # #$  <""#7;;;  !57GHHHGFFHHHHH GFFHHHHs1   8E? BD."E? .D22E? 5D261E? ?FN)r;   r8   r<   r  r  r  r   r   r   r   r  r  r   r(   r)   r   r  r  r!   r   r   r  r    s@       < < <  0% % % X5513 3*A *A3 3*AX X5513 3A A3 3A< X_S\X-/WXXX33-/ /00226 6 32/ / YX6 6 6r   r  c                   f    e Zd Zd Z ej        ej        dk    d          d             Zd Z	d Z
dS )RaiseSignalTestc                     |                      t                    5  t          j        t          j                   d d d            d S # 1 swxY w Y   d S r@   )rJ   KeyboardInterruptr   r  rn   rN   s    r   test_sigintzRaiseSignalTest.test_sigint  s    011 	/ 	/...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s   AAAr   zWindows specific testc                     	 d}t          j        |           |                     d           d S # t          $ r"}|j        t          j        k    rn Y d }~d S d }~ww xY w)Nra   z#OSError (Invalid argument) expected)r   r  failr   errnoEINVAL)r.   rU   es      r   test_invalid_argumentz%RaiseSignalTest.test_invalid_argument  sy    	F'''II;<<<<< 	 	 	w%,&& 	s   +/ 
AAAc                    dfd}t          j         t           j        |          }|                     t           j         t           j        |           t          j        t           j                   |                                d S )NFc                     dd S r'  r!   )abis_oks     r   rg   z-RaiseSignalTest.test_handler.<locals>.handler  s    EEEr   )r   rn   r   r  r   )r.   rg   
old_signalr  s      @r   test_handlerzRaiseSignalTest.test_handler  s{    	 	 	 	 	 ]6='::
v}jAAAFM***r   c                 ^    d}t          d|          \  }}}|                     d|           d S )Nzif 1:
        import _thread
        class Foo():
            def __del__(self):
                _thread.interrupt_main()

        x = Foo()
        r   s/   OSError: Signal 2 ignored due to race condition)r   rm   )r.   r   rcouterrs        r   test__thread_interrupt_mainz+RaiseSignalTest.test__thread_interrupt_main  s;     (d33CH#NNNNNr   N)r;   r8   r<   r  r   r   r(   r)   r  r  r  r!   r   r   r  r    sy        / / / X_S\W,.EFF	 	 GF		 	 	O O O O Or   r  c                   V    e Zd Z ej         eed          d          d             ZdS )PidfdSignalTestpidfd_send_signalzpidfd support not built inc                    |                      t                    5 }t          j        dt          j                   d d d            n# 1 swxY w Y   |j        j        t          j        k    r|                     d           n/|j        j        t          j	        k    r|                     d           | 
                    |j        j        t          j                   t          j        dt          j                     t          j                  }|                     t          j        |           |                     t&          d          5  t          j        |t          j        t)                      d           d d d            n# 1 swxY w Y   |                      t*                    5  t          j        |t          j                   d d d            d S # 1 swxY w Y   d S )Nr   zkernel does not support pidfdsz"Not enough privileges to use pidfsz/proc/z^siginfo must be None$)rJ   r   r   r  rn   r   r  ENOSYSr   EPERMr'   EBADFrr   openr  O_DIRECTORYr   r   assertRaisesRegexrQ   objectr  )r.   r   my_pidfds      r   test_pidfd_send_signalz&PidfdSignalTest.test_pidfd_send_signal  sI   
 w'' 	72$Q666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7<--MM:;;;;\5;..MM>???+U[99971BIKK112>BB(+++##I/GHH 	K 	K$Xv}fhhJJJ	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K011 	> 	>$Xv}===	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s5    AAA	.FF
F( GGGN)r;   r8   r<   r   r   r   r   r  r!   r   r   r  r    sR        X+,,$ > >	 > > >r   r  c                  ,    t          j                     d S r@   )r   reap_childrenr!   r   r   tearDownModuler     s    r   __main__)-r*   r  rE   r5   rr   r  r   r   r  r   r(   r  r`  r   rp  r   test.supportr   test.support.script_helperr   r   r   r   ImportErrorTestCaser	   r   r)   r>   r   r   r   r   r   r   r   r  r1  rd  r  r  r  r   r;   mainr!   r   r   <module>r     sH          				            



             " " " " " " E E E E E E E E ) ) ) ) ) )   III/= /= /= /= /=8$ /= /= /=d (*@AAa= a= a= a= a=" a= a= BAa=P S\W,.@AA-D -D -D -D -D* -D -D BA-D`S! S! S! S! S!H% S! S! S!l (*@AAs= s= s= s= s=) s= s= BAs=l WWV\224LMM@% @% @% @% @%h/ @% @% NM@%F (*@AAWWV^446STTWWR((*>??R& R& R& R& R&x( R& R& @?  UT BAR&j (*@AAWWV[11Rggfk6R6RJL Ld1 d1 d1 d1 d1" d1 d1L L BAd1NP4 P4 P4 P4 P4(+ P4 P4 P4f
y y y y y" y y yx)O )O )O )O )Oh' )O )O )OZ> > > > >h' > > >*   zHMOOOOO s   A A#"A#