Current File : //usr/local/apps/python3/lib/python3.11/test/__pycache__/test_signal.cpython-311.pyc
�

�Ke���	�N�ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
mZddlmZddlmZmZddlmZ	ddlZn
#e$rdZYnwxYwGd�dej��Zeje	jdkd	��Gd
�dej����Zeje	jdkd��Gd
�dej����ZGd�dej��Zeje	jdkd	��Gd�dej����Zeje ed��d��Gd�dej����Z!eje	jdkd	��eje ed��d��ej"��eje ed��d��Gd�dej����������Z#eje	jdkd	��eje ed��oe ed��d��Gd �d!ej������Z$Gd"�d#ej��Z%Gd$�d%ej��Z&Gd&�d'ej��Z'Gd(�d)ej��Z(d*�Z)e*d+krej+��dSdS),�N)�support)�	os_helper)�assert_python_ok�spawn_python)�threading_helperc��eZdZd�Zd�ZdS)�GenericTestsc��tt��D�]}tt|��}|dvr!|�|tj���=|dvr!|�|tj���b|�d��r6|�d��s!|�|tj����|�d��r@|�|tj��|�tj
d����tjtj
ddd	�t�
��}tj|tj��tjtj
ddd�t�
��}tj|tj��ttd
d��}|�@tjtj
d
dd�t�
��}tj||��dSdS)N>�SIG_DFL�SIG_IGN>�	SIG_BLOCK�SIG_SETMASK�SIG_UNBLOCK�SIG�SIG_�CTRL_�win32�Signals�signalc��|���r+|�d��o|�d��p|�d��S)Nrrr)�isupper�
startswith��names �:/usr/local/apps/python3/lib/python3.11/test/test_signal.py�<lambda>z)GenericTests.test_enums.<locals>.<lambda>)sO���L�L�N�N�Q�����/�/�O�����8O�8O�4O�0����w�/�/��)�source�Handlersc�
�|dvS)N)rr�rs rrz)GenericTests.test_enums.<locals>.<lambda>3s��T�%;�;�r�Sigmasksc�
�|dvS)N)r
rrr!rs rrz)GenericTests.test_enums.<locals>.<lambda><s���)T�!T�r)�dirr�getattr�assertIsInstancerr"rr�assertEqual�sys�platform�enum�
_old_convert_�IntEnum�_test_simple_enum)�selfr�sig�CheckedSignals�CheckedHandlersr"�CheckedSigmaskss       r�
test_enumszGenericTests.test_enumss�����K�K�
	8�
	8�D��&�$�'�'�C��-�-�-��%�%�c�6�?�;�;�;�;��D�D�D��%�%�c�6�?�;�;�;�;�����'�'�
8�����0G�0G�
8��%�%�c�6�>�:�:�:�:�����)�)�
8��%�%�c�6�>�:�:�:�� � ���w�7�7�7���+���i��0�0��
����	
��~�v�~�>�>�>��,���j�(�;�;������
	
�����@�@�@��6�:�t�4�4����"�0��L�*�h�T�T�!����O�

�"�?�H�=�=�=�=�=�
 �rc���tt��D]Z}tt|��}tj|��r/tj|��s|�|jd���[dS)Nr)r$rr%�inspect�	isroutine�	isbuiltinr'�
__module__)r.r�values   r�test_functions_module_attrz'GenericTests.test_functions_module_attrAsq����K�K�	=�	=�D��F�D�)�)�E�� ��'�'�
=��0A�%�0H�0H�
=�� � ��!1�8�<�<�<��	=�	=rN)�__name__r8�__qualname__r3r:r!rrr	r	s3������%>�%>�%>�N=�=�=�=�=rr	rzNot valid on Windowsc���eZdZd�Zd�Zd�Zd�Zd�Zd�Ze	j
eed��d��d	���Z
e	j
ejd
��ej��d�����ZdS)
�
PosixTestsc��dS�Nr!�r.�argss  r�trivial_signal_handlerz!PosixTests.trivial_signal_handlerLs���rc��|�ttjd��|�ttjd|j��|�ttjd��dS)Ni�)�assertRaises�
ValueErrorr�	getsignalrC�	strsignal�r.s r�,test_out_of_range_signal_number_raises_errorz7PosixTests.test_out_of_range_signal_number_raises_errorOsf�����*�f�&6��=�=�=����*�f�m�T��5�	7�	7�	7�	
���*�f�&6��=�=�=�=�=rc�h�|�ttjtjd��dSr@)rE�	TypeErrorr�SIGUSR1rIs r�0test_setting_signal_handler_to_none_raises_errorz;PosixTests.test_setting_signal_handler_to_none_raises_errorWs1�����)�V�]� �.�$�	0�	0�	0�	0�	0rc��tjtj|j��}|�|tj��|�tjtj��|j��tjtj|��|�tjtj��|��dSr@)r�SIGHUPrCr&rr'rG)r.�hups  r�test_getsignalzPosixTests.test_getsignal[s����m�F�M�4�+F�G�G�����c�6�?�3�3�3�����)�&�-�8�8��4�	6�	6�	6��
�f�m�S�)�)�)�����)�&�-�8�8�#�>�>�>�>�>rc�2�|�dtjtj����|�dtjtj����|�dtjtj����dS)N�	Interrupt�
Terminated�Hangup)�assertInrrH�SIGINT�SIGTERMrPrIs r�test_strsignalzPosixTests.test_strsignalcsk���
�
�k�6�#3�F�M�#B�#B�C�C�C��
�
�l�F�$4�V�^�$D�$D�E�E�E��
�
�h�� 0��� ?� ?�@�@�@�@�@rc��tj�t��}tj�|d��}t|��dS)Nzsignalinterproctester.py)�os�path�dirname�__file__�joinr)r.r^�scripts   r�test_interprocess_signalz#PosixTests.test_interprocess_signalis?���'�/�/�(�+�+������g�'A�B�B���� � � � � r�
valid_signalszrequires signal.valid_signalsc��tj��}|�|t��|�tjj|��|�tjj|��|�d|��|�tj	|��|�
t|��tj	��tt��D]�}|�
d��s�|dvr�|�|���5tt|��}|�|d��|�
|tj	��ddd��n#1swxYwY��dS)Nrr>rrr)rrcr&�setrWrrX�SIGALRM�assertNotIn�NSIG�
assertLess�lenr$r�subTestr%�assertGreaterEqual)r.�sr�signums    r�test_valid_signalszPosixTests.test_valid_signalsns���

� �"�"�����a��%�%�%��
�
�f�n�+�Q�/�/�/��
�
�f�n�,�a�0�0�0�����A���������a�(�(�(�����A�����,�,�,���K�K�		5�		5�D��?�?�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���tjtjddgtj���}|�d|j��|�|jtj
��dS)z+KeyboardInterrupt triggers exit via SIGINT.�-czaimport os, signal, time
os.kill(os.getpid(), signal.SIGINT)
for _ in range(999): time.sleep(0.01)��stderr�KeyboardInterruptN)�
subprocess�runr(�
executable�PIPErWrtr'�
returncoderrX)r.�processs  r�!test_keyboard_interrupt_exit_codez,PosixTests.test_keyboard_interrupt_exit_code�sn���.����9�:�"��(�(�(��	
�
�
�*�G�N�;�;�;�����+�f�m�^�<�<�<�<�<rN)r;r8r<rCrJrNrRrZrb�unittest�
skipUnless�hasattrrror(rxr�requires_subprocessr|r!rrr>r>Js�������
�
�
�>�>�>�0�0�0�?�?�?�A�A�A�!�!�!�
�X������(�(�'���5�5�	��5�,�X����)C�D�D� �W� �"�"�	=�	=�#�"�E�D�	=�	=�	=rr>zWindows specificc��eZdZd�Zd�Zejejd��e	j
��d�����ZdS)�WindowsSignalTestsc��tj��}|�|t��|�t|��d��|�tjj|��|�	d|��|�	tj
|��|�t|��tj
��dS)N�r)rrcr&rerlrjrWrrXrgrhri�r.rms  rroz%WindowsSignalTests.test_valid_signals�s���� �"�"�����a��%�%�%�����A����*�*�*��
�
�f�n�+�Q�/�/�/�����A���������a�(�(�(�����A�����,�,�,�,�,rc��d�}t��}tjtjtjtjtjtjtjfD]S}tj	|���=tj|tj||����|�
|���T|�|��|�t��5tjd|��ddd��n#1swxYwY|�t��5tjd|��ddd��dS#1swxYwYdS)Nc��dSr@r!)�x�ys  rrz3WindowsSignalTests.test_issue9324.<locals>.<lambda>�s��t�r����)rer�SIGABRT�SIGBREAK�SIGFPE�SIGILLrX�SIGSEGVrYrG�add�
assertTruerErF)r.�handler�checkedr/s    r�test_issue9324z!WindowsSignalTests.test_issue9324�s���#�#���%�%���N�F�O�V�]��M�6�=�&�.��N�$�	!�	!�C�
���$�$�0��
�c�6�=��g�#>�#>�?�?�?����C� � � ������ � � �
�
�
�z�
*�
*�	'�	'��M�"�g�&�&�&�	'�	'�	'�	'�	'�	'�	'�	'�	'�	'�	'����	'�	'�	'�	'��
�
�z�
*�
*�	&�	&��M�!�W�%�%�%�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&����	&�	&�	&�	&�	&�	&s$�$D�D
�
D
�+E�E�Erpc���tjtjddgtj���}|�d|j��d}|�|j|��dS)z?KeyboardInterrupt triggers an exit using STATUS_CONTROL_C_EXIT.rrzraise KeyboardInterruptrsrul:N)	rvrwr(rxryrWrtr'rz)r.r{�STATUS_CONTROL_C_EXITs   rr|z4WindowsSignalTests.test_keyboard_interrupt_exit_code�sk���.����'@�A�!��(�(�(��	
�
�
�*�G�N�;�;�;� *������+�-B�C�C�C�C�CrN)r;r8r<ror�r}r~r(rxrr�r|r!rrr�r��s|������-�-�-�&�&�&�*�X����)C�D�D� �W� �"�"�D�D�#�"�E�D�D�D�Drr�c��eZdZd�Zd�Zejejd��d���Z	ej
ejd��ejee
d��d��d�����Zej
ejd��ejejd��d	�����Zej
ejd
kd��ej
ejd��ejee
d��d��d�������Zd
S)�
WakeupFDTestsc�L�|�t��5tjtj���ddd��n#1swxYwY|�t��5tjtjd��ddd��dS#1swxYwYdS)N)rnF)rErLr�
set_wakeup_fdrXrIs r�test_invalid_callzWakeupFDTests.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� Bc��tj��}|�ttft
j|��dSr@)r�make_bad_fdrErF�OSErrorrr�)r.�fds  r�test_invalid_fdzWakeupFDTests.test_invalid_fd�sA��
�
"�
$�
$�����:�w�/� �.��	4�	4�	4�	4�	4rzneeds working sockets.c���tj��}|���}|���|�tt
ftj|��dSr@)�socket�fileno�closerErFr�rr�)r.�sockr�s   r�test_invalid_socketz!WakeupFDTests.test_invalid_socket�sX���}����
�[�[�]�]���
�
�������:�w�/� �.��	4�	4�	4�	4�	4rzEmscripten cannot fstat pipes.�pipe�requires os.pipe()c���tj��\}}|�tj|��|�tj|��tj��\}}|�tj|��|�tj|��t	td��r*tj|d��tj|d��t
j|��|�t
j|��|��|�t
jd��|��|�t
jd��d��dS)N�set_blockingFr�)	r\r��
addCleanupr�rr�rr�r')r.�r1�w1�r2�w2s     r�test_set_wakeup_fd_resultz'WakeupFDTests.test_set_wakeup_fd_result�s*��������B������"�%�%�%������"�%�%�%�������B������"�%�%�%������"�%�%�%��2�~�&�&�	'��O�B��&�&�&��O�B��&�&�&���R� � � �����-�b�1�1�2�6�6�6�����-�b�1�1�2�6�6�6�����-�b�1�1�2�6�6�6�6�6rc�v�tj��}|�|j��|�d��|���}tj��}|�|j��|�d��|���}tj|��|�tj|��|��|�tjd��|��|�tjd��d��dS)NFr�)r�r�r��setblockingr�rr�r')r.�sock1�fd1�sock2�fd2s     r� test_set_wakeup_fd_socket_resultz.WakeupFDTests.test_set_wakeup_fd_socket_result�s����
���������$�$�$�
���%� � � ��l�l�n�n���
���������$�$�$�
���%� � � ��l�l�n�n����S�!�!�!�����-�c�2�2�C�8�8�8�����-�b�1�1�3�7�7�7�����-�b�1�1�2�6�6�6�6�6rrztests specific to POSIXc�8�tj��\}}|�tj|��|�tj|��tj|d��|�t��5}tj|��ddd��n#1swxYwY|�	t|j��d|z��tj|d��tj|��tjd��dS)NTz&the fd %s must be in non-blocking modeFr�)r\r�r�r�r�rErFrr�r'�str�	exception)r.�rfd�wfd�cms    r�test_set_wakeup_fd_blockingz)WakeupFDTests.test_set_wakeup_fd_blockings5���7�9�9���S������#�&�&�&������#�&�&�&�	���T�"�"�"�
�
�
�z�
*�
*�	&�b�� ��%�%�%�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&����	&�	&�	&�	&�����R�\�*�*�A�C�G�	I�	I�	I�	���U�#�#�#���S�!�!�!���R� � � � � s�B'�'B+�.B+N)r;r8r<r�r�r}r~r�has_socket_supportr��skipIf�
is_emscriptenrr\r�r�r(r)r�r!rrr�r��s�������7�7�7�4�4�4�
�X���3�5M�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���3�5M�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�!�!�!rr�c� �eZdZejedud��dd�d���Zejedud��ejee	d��d��d�����Z
d	�Zd
�Zd�Z
ejeed��d
��d���ZdS)�WakeupSignalTestsN�need _testcapiT��orderedc��d�ttt|����||��}t	d|��dS)Naif 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)
        rr)�format�tuple�map�intr)r.�	test_bodyr��signals�codes     r�check_wakeupzWakeupSignalTests.check_wakeup#sL�� �@
�F�5��S�'�*�*�+�+�W�i�@�@�A	
�D	��t�$�$�$�$�$rr�r�c�z�d}tj��\}}	tj|d��|�d��n#t$rYnwxYwtj|��tj|��n-#tj|��tj|��wxYwt
d|��dS)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 piperr)r\r��write�skipTestr�r�r)r.r��r�ws    r�test_wakeup_write_errorz)WakeupSignalTests.test_wakeup_write_errorJs���!��D�w�y�y���1�	��H�Q�����
�M�M�U�V�V�V�V���	�	�	��D�	����

�H�Q�K�K�K��H�Q�K�K�K�K��
�H�Q�K�K�K��H�Q�K�K�K�K������t�$�$�$�$�$s(�A�A>�
A�A>�A�A>�>*B(c�F�|�dtj��dS)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�rrfrIs r�test_wakeup_fd_earlyz&WakeupSignalTests.test_wakeup_fd_earlys0������>�^�?	�	�	�	�	rc�F�|�dtj��dS)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�rIs r�test_wakeup_fd_duringz'WakeupSignalTests.test_wakeup_fd_during�s0������6�^�7	�	�	�	�	rc�\�|�dtjtj��dS)Nz�def test():
            signal.signal(signal.SIGUSR1, handler)
            signal.raise_signal(signal.SIGUSR1)
            signal.raise_signal(signal.SIGALRM)
        )r�rrMrfrIs r�test_signumzWakeupSignalTests.test_signum�s4�������^�V�^�		-�	-�	-�	-�	-r�pthread_sigmask�need signal.pthread_sigmask()c�`�|�dtjtjd���dS)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�rrM�SIGUSR2rIs r�test_pendingzWakeupSignalTests.test_pending�s=��	
�����n�f�n�e�	�	=�	=�	=�	=�	=r)r;r8r<r}r��	_testcapir�r~rr\r�r�r�r�rr�r!rrr�r�!s�������X�_�Y�$�&�(8�9�9�8<�$%�$%�$%�$%�:�9�$%�L�X�_�Y�$�&�(8�9�9��X�����V�,�,�.B�C�C�1%�1%�D�C�:�9�1%�f � � �D���<-�-�-��X�����):�;�;�8�:�:�
=�
=�:�:�
=�
=�
=rr��
socketpairzneed socket.socketpairc��eZdZejedud��d���Zejedud��d���Zejedud��d���ZdS)�WakeupSocketSignalTestsNr�c�*�d}td|��dS)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()
        rr�r�r.r�s  r�test_socketz#WakeupSocketSignalTests.test_socket�s!����>	��t�$�$�$�$�$rc�|�tjdkrd}nd}d�|���}td|��dS)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)
        ��actionrr�r\rr�r�r.r�r�s   r�test_send_errorz'WakeupSocketSignalTests.test_send_error�sQ���7�d�?�?��F�F��F�!�B
�F�&�F�!�!�C	
�D	��t�$�$�$�$�$rc�|�tjdkrd}nd}d�|���}td|��dS)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�rrr�r�s   r�test_warn_on_full_bufferz0WakeupSocketSignalTests.test_warn_on_full_buffer*sR���7�d�?�?��F�F��F�g�N
�F�&�F�!�!�O	
�P	��t�$�$�$�$�$r)	r;r8r<r}r�r�r�r�r�r!rrr�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%rr��siginterruptzneeds signal.siginterrupt()r�r�c�&�eZdZd�Zd�Zd�Zd�ZdS)�SiginterruptTestc��d|�d�}td|��5}	|j���}|�tj���\}}||z}|���}|dvrtd|�d|�����|dkcd	d	d	��S#tj	$r#|�
��Yd	d	d	��d
SwxYw#1swxYwYd	S)z�Perform a read during which a signal will arrive.  Return True if the
        read is interrupted by the signal and raises an exception.  Return False
        if it returns normally.
        zif 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)
        rr)�timeout)���Child error (exit code �): r�NF)r�stdout�readline�communicater�
SHORT_TIMEOUT�wait�	Exceptionrv�TimeoutExpired�kill)r.�	interruptr�r{�
first_liner�rt�exitcodes        r�readpipe_interruptedz%SiginterruptTest.readpipe_interrupted�sf���T�y�y�G#��H�$��
%�
%�	'��
'�$�^�4�4�6�6�
�!(�!4�!4�W�=R�!4�!S�!S����
$�f�,��"�<�<�>�>���6�)�)�#�)�'/�x�x���%9�:�:�:� �A�
�	'�	'�	'�	'�	'�	'�	'�	'���,�
�
�
��������	'�	'�	'�	'�	'�	'�	'�	'�
����
	'�	'�	'�	'����	'�	'�	'�	'�	'�	's4�C�<B�7C�#C�<C�
C�C�C�Cc�Z�|�d��}|�|��dSr@�r
r��r.�interrupteds  r�test_without_siginterruptz*SiginterruptTest.test_without_siginterrupt��/���/�/��5�5������$�$�$�$�$rc�Z�|�d��}|�|��dS�NTrr
s  r�test_siginterrupt_onz%SiginterruptTest.test_siginterrupt_on�rrc�Z�|�d��}|�|��dS)NF)r
�assertFalser
s  r�test_siginterrupt_offz&SiginterruptTest.test_siginterrupt_off�s1���/�/��6�6������%�%�%�%�%rN)r;r8r<r
rrrr!rrr�r��sQ������:'�:'�:'�x%�%�%�%�%�%�&�&�&�&�&rr��	getitimer�	setitimerz/needs signal.getitimer() and signal.setitimer()c��eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	e
jej
dvd	��d
���Zd�Zd�Zd
S)�
ItimerTestc��d|_d|_d|_tjtj|j��|_dS)NFr)�hndl_called�
hndl_count�itimerrrf�sig_alrm�	old_alarmrIs r�setUpzItimerTest.setUp�s3�� �����������v�~�t�}�E�E����rc��tjtj|j��|j�tj|jd��dSdS)Nr)rrfr rrrIs r�tearDownzItimerTest.tearDown�sC���
�f�n�d�n�5�5�5��;�"���T�[�!�,�,�,�,�,�#�"rc��d|_dSr)rrAs  rrzItimerTest.sig_alrms������rc���d|_|jdkrtjd���|jdkrtjtjd��|xjdz
c_dS)NTr�z.setitimer didn't disable ITIMER_VIRTUAL timer.r�)rrr�ItimerErrorr�ITIMER_VIRTUALrAs  r�
sig_vtalrmzItimerTest.sig_vtalrmsh������?�Q����$�&���
�
�_��
!�
!���V�2�A�6�6�6����1�����rc�R�d|_tjtjd��dS)NTr)rrr�ITIMER_PROFrAs  r�sig_profzItimerTest.sig_profs&��������+�Q�/�/�/�/�/rc�^�|�tjtjdd��dS)Nr�r)rErr'r�ITIMER_REALrIs r�test_itimer_exczItimerTest.test_itimer_excs0��	
���&�,�f�.>��A�F�F�F�	H�	Hrc��tj|_tj|jd��tj��|�|jd��dS)Ng�?T)rr.rr�pauser'rrIs r�test_itimer_realzItimerTest.test_itimer_real!sK���(�������c�*�*�*����������)�4�0�0�0�0�0r)�netbsd5zDitimer not reliable (does not mix well with threading) on some BSDs.c�L�tj|_tjtj|j��tj|jdd��t
j��}t
j��|z
dkrItddd��}tj	|j��dkrn/t
j��|z
dk�I|�
d��|�tj	|j��d��|�|jd	��dS)
Ng333333�?皙�����?�N@�90�2	铖���r;�8timeout: likely cause: machine too slow or load too highT)
rr(r�	SIGVTALRMr)r�time�	monotonic�powrr�r'r�r.�
start_time�_s   r�test_itimer_virtualzItimerTest.test_itimer_virtual(s���+����
�f�&���8�8�8�����c�3�/�/�/��^�%�%�
��n����+�d�2�2��E�5�(�+�+�A�����,�,�
�:�:��	�n����+�d�2�2�
�M�M�!�
"�
"�
"�	
����)�$�+�6�6�
�C�C�C�����)�4�0�0�0�0�0rc�L�tj|_tjtj|j��tj|jdd��t
j��}t
j��|z
dkrItddd��}tj	|j��dkrn/t
j��|z
dk�I|�
d��|�tj	|j��d��|�|jd��dS)	Nr5r6r7r8r9r:r<T)
rr+r�SIGPROFr,rr>r?r@rr�r'rrAs   r�test_itimer_profzItimerTest.test_itimer_prof>s���(����
�f�n�d�m�4�4�4�����c�3�/�/�/��^�%�%�
��n����+�d�2�2��E�5�(�+�+�A�����,�,�
�:�:��	�n����+�d�2�2�
�M�M�!�
"�
"�
"�	
����)�$�+�6�6�
�C�C�C�����)�4�0�0�0�0�0rc��tj|_tj|jd��t	jd��|�|jd��dS)N���ư>r&T)rr.rrr>�sleepr'rrIs r�test_setitimer_tinyzItimerTest.test_setitimer_tinyRsO���(�������d�+�+�+��
�1�
�
�
�����)�4�0�0�0�0�0rN)r;r8r<r!r#rr)r,r/r2r}r�r(r)rDrGrKr!rrrr�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�1rrc�v�eZdZdZejeed��d��d���Zejeed��d��ejeed��d��d�����Z	ejeed��d	��e
j��d
�����Zejeed��d��d���Z
ejeed��d
��d���Zejeed��d��d���Zejeed��d��d���Zejeed��d��d���Zejeed��d��d���Zejeed��d��d���Zejeed��d
��ejeed��d��e
j��d�������Zejeed��d��d���Zejeed��d��d���Zejeed��d��e
j��d�����Zejeed��d	��e
j��d�����ZdS)�PendingSignalsTestsz[
    Test pthread_sigmask(), pthread_kill(), sigpending() and sigwait()
    functions.
    �
sigpendingzneed signal.sigpending()c�l�|�tj��t����dSr@)r'rrNrerIs r�test_sigpending_emptyz)PendingSignalsTests.test_sigpending_emptyas-��	
����*�,�,�c�e�e�4�4�4�4�4rr�r�c�*�d}td|��dS)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")
        rrr�r�s  r�test_sigpendingz#PendingSignalsTests.test_sigpendingfs!��
��0	��t�$�$�$�$�$r�pthread_killzneed signal.pthread_kill()c�*�d}td|��dS)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")
        rrr�r�s  r�test_pthread_killz%PendingSignalsTests.test_pthread_kill�s!����(	��t�$�$�$�$�$rc�\�d|����d|�d�}td|��dS)zo
        test: body of the "def test(signum):" function.
        blocked: number of the blocked signal
        z�if 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)
        rrN)�stripr)r.�blocked�testr�s    r�wait_helperzPendingSignalsTests.wait_helper�s=���N�z�z�|�|�|�|�W�W�W�A &��J	��t�$�$�$�$�$r�sigwaitzneed signal.sigwait()c�F�|�tjd��dS)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))
        �rZrrfrIs r�test_sigwaitz PendingSignalsTests.test_sigwait�s/��	
�����*�	
�	
�	
�	
�	
r�sigwaitinfozneed signal.sigwaitinfo()c�F�|�tjd��dS)Nz�
        def test(signum):
            signal.alarm(1)
            info = signal.sigwaitinfo([signum])
            if info.si_signo != signum:
                raise Exception("info.si_signo != %s" % signum)
        r]rIs r�test_sigwaitinfoz$PendingSignalsTests.test_sigwaitinfo��/��	
�����*�	
�	
�	
�	
�	
r�sigtimedwaitzneed signal.sigtimedwait()c�F�|�tjd��dS)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)
        r]rIs r�test_sigtimedwaitz%PendingSignalsTests.test_sigtimedwait�rbrc�F�|�tjd��dS)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)
        r]rIs r�test_sigtimedwait_pollz*PendingSignalsTests.test_sigtimedwait_poll�s/��	
�����*�	
�	
�	
�	
�	
rc�F�|�tjd��dS)Nz�
        def test(signum):
            received = signal.sigtimedwait([signum], 1.0)
            if received is not None:
                raise Exception("received=%r" % (received,))
        r]rIs r�test_sigtimedwait_timeoutz-PendingSignalsTests.test_sigtimedwait_timeout�s/��	
�����*�	
�	
�	
�	
�	
rc�n�tj}|�ttj|gd��dS)Ng�)rrfrErFrc)r.rns  r�"test_sigtimedwait_negative_timeoutz6PendingSignalsTests.test_sigtimedwait_negative_timeouts0��������*�f�&9�F�8�T�J�J�J�J�Jrc�&�tdd��dS)Nrra�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�rIs r�test_sigwait_threadz'PendingSignalsTests.test_sigwait_threads'��	�� �	
�	
�	
�	
�	
rc�B�|�ttj��|�ttjd��|�ttjddd��|�ttjdg��|�t
��5tjtjtjg��ddd��n#1swxYwY|�t
��5tjtjdg��ddd��n#1swxYwY|�t
��5tjtjddzg��ddd��dS#1swxYwYdS)Nr&r�r�i�ri�)rErLrr�r�rFr
rhrIs r�test_pthread_sigmask_argumentsz2PendingSignalsTests.test_pthread_sigmask_arguments/s1��	
���)�V�%;�<�<�<����)�V�%;�Q�?�?�?����)�V�%;�Q��1�E�E�E����'�6�#9�4��D�D�D�
�
�
�z�
*�
*�	D�	D��"�6�#3�f�k�]�C�C�C�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D�	D����	D�	D�	D�	D�
�
�
�z�
*�
*�	:�	:��"�6�#3�a�S�9�9�9�	:�	:�	:�	:�	:�	:�	:�	:�	:�	:�	:����	:�	:�	:�	:�
�
�
�z�
*�
*�	@�	@��"�6�#3�a��g�Y�?�?�?�	@�	@�	@�	@�	@�	@�	@�	@�	@�	@�	@�	@����	@�	@�	@�	@�	@�	@s6�5+C,�,C0�3C0�!D>�>E�E�#$F�F�Fc�j�tjtjtj����}|�tjtj|��tjtjtj����}|�|tj����dSr@)rr�r
rcr�rr�assertLessEqualr�s  r�"test_pthread_sigmask_valid_signalsz6PendingSignalsTests.test_pthread_sigmask_valid_signals=s���
�"�6�#3�V�5I�5K�5K�L�L������.��0B�A�F�F�F��"�6�#5�v�7K�7M�7M�N�N�����Q�� 4� 6� 6�7�7�7�7�7rc�*�d}td|��dS)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))
        rrr�r�s  r�test_pthread_sigmaskz(PendingSignalsTests.test_pthread_sigmaskFs#��G��P	��t�$�$�$�$�$rc���d}td|��5}|���\}}|���}|dkrtd|�d|�����	ddd��dS#1swxYwYdS)Na7if 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)
        rrr�r�r�)rrrr)r.r�r{r�rtr	s      r�test_pthread_kill_main_threadz1PendingSignalsTests.test_pthread_kill_main_thread�s������$��
%�
%�	4��$�0�0�2�2�N�F�F��|�|�~�~�H��1�}�}��i�!)���6�6�!3�4�4�4��	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�	4�	4s�AA(�(A,�/A,N)r;r8r<�__doc__r}r~rrrPrRr�requires_working_threadingrUrZr^rarergrirkrmrorrrtrvr!rrrMrM\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�4rrMc�&�eZdZdZd�Zd�Zd�Zeje	e
d��d��d���Zeje	e
d��d��d���Zeje	e
d	��d
��e
j��d�����ZdS)
�
StressTestz�
    Stress signal delivery, especially when a signal arrives in
    the middle of recomputing the signal state or executing
    previously tripped signal handlers.
    c�r�tj||��}|�tj||��dSr@)rr�)r.rnr��old_handlers    r�setsigzStressTest.setsig�s1���m�F�G�4�4������
�v�{�;�;�;�;�;rc����d�g�d��fd�	}|�tjtjd��|�tj|��|��t
����kr'tjd��t
����k�'�fd�tt
���dz
��D��}tj|��}tj
rtd|fz��|S)	N�c���t����krG��tj����t	jtjd��dSdS)NrI)rj�appendr>�perf_counterrrr.)rn�frame�N�timess  ��rr�z5StressTest.measure_itimer_resolution.<locals>.handler�sR����5�z�z�A�~�~����T�.�0�0�1�1�1�� ��!3�T�:�:�:�:�:��~rrg����MbP?c�8��g|]}�|dz�|z
��S)r&r!)�.0�ir�s  �r�
<listcomp>z8StressTest.measure_itimer_resolution.<locals>.<listcomp>�s*���J�J�J�q�U�1�Q�3�Z�%��(�*�J�J�Jrr&z,detected median itimer() resolution: %.6f s.�NN)r�rrr.r}rfrjr>rJ�range�
statistics�medianr�verbose�print)r.r��	durations�medr�r�s    @@r�measure_itimer_resolutionz$StressTest.measure_itimer_resolution�s��������	;�	;�	;�	;�	;�	;�	;�	
����(�&�*<�a�@�@�@����F�N�G�,�,�,���	�	�	��%�j�j�1�n�n��J�t�����%�j�j�1�n�n�K�J�J�J�E�#�e�*�*�q�.�4I�4I�J�J�J�	���	�*�*���?�	K��@�C�6�I�J�J�J��
rc��|���}|dkrdS|dkrdS|�d|fz��dS)Ng-C��6?i'g{�G�z�?�dz^detected itimer resolution (%.3f s.) too high (> 10 ms.) on this platform (or system too busy))r�r�)r.�resos  r�decide_itimer_countzStressTest.decide_itimer_count�sa���-�-�/�/���4�<�<��5�
�T�\�\��3��M�M�M�!�G�$�
%�
%�
%�
%�
%rrztest needs setitimer()c�"��|���}g�d�}d�fd�	}|�tj|��|�tj|��|�tj|��d}t
j��tj	z}||k�rAtjtj��tj��|dz
}t���|krUt
j��|kr>t
jd��t���|krt
j��|k�>tjtj��tj��|dz
}t���|krUt
j��|kr>t
jd��t���|krt
j��|k�>||k��A|�t���|d��dS)	z;
        This test uses dependent signal handlers.
        c�r�tjtjdtj��dzz��dS)NrI��h㈵��>)rrr.�random)rnr�s  r�
first_handlerz@StressTest.test_stress_delivery_dependent.<locals>.first_handler�s0��
��V�/���
���$�8N�1N�O�O�O�O�OrNc�2����|��dSr@�r��rnr��sigss  �r�second_handlerzAStressTest.test_stress_delivery_dependent.<locals>.second_handler������K�K������rrr&r��Some signals were lostr�)r�r}rrFrMrfr>r?rrr\r�getpidrjrJr')r.r�r�r��
expected_sigs�deadliner�s      @r�test_stress_delivery_dependentz)StressTest.test_stress_delivery_dependent�s����
�$�$�&�&����	P�	P�	P�	 �	 �	 �	 �	 �	 �	
���F�N�M�2�2�2����F�N�M�2�2�2����F�N�N�3�3�3��
��>�#�#�g�&;�;���a����G�B�I�K�K���0�0�0��Q��M��d�)�)�m�+�+���0@�0@�8�0K�0K��
�4� � � ��d�)�)�m�+�+���0@�0@�8�0K�0K�
�G�B�I�K�K���0�0�0��Q��M��d�)�)�m�+�+���0@�0@�8�0K�0K��
�4� � � ��d�)�)�m�+�+���0@�0@�8�0K�0K��a���	
����T���A�'?�@�@�@�@�@rc���|���}g��fd�}|�tj|��|�tj|��d}tj��tjz}||kr�tj	tj
dtj��dzz��tj
tj��tj��|dz
}t���|krUtj��|kr>tjd��t���|krtj��|k�>||k��|�t���|d��dS)z>
        This test uses simultaneous signal handlers.
        c�2����|��dSr@r�r�s  �rr�z=StressTest.test_stress_delivery_simultaneous.<locals>.handlerr�rrrIr�r�r�N)r�r}rrMrfr>r?rrrr.r�r\rr�rjrJr')r.r�r�r�r�r�s     @r�!test_stress_delivery_simultaneousz,StressTest.test_stress_delivery_simultaneouss_���
�$�$�&�&����	 �	 �	 �	 �	 �	
���F�N�G�,�,�,����F�N�G�,�,�,��
��>�#�#�g�&;�;���a���
��V�/���
���$�8N�1N�O�O�O��G�B�I�K�K���0�0�0��Q��M��d�)�)�m�+�+���0@�0@�8�0K�0K��
�4� � � ��d�)�)�m�+�+���0@�0@�8�0K�0K��a���	
����T���A�'?�@�@�@�@�@rrMztest needs SIGUSR1c�2���	�
��tj�d�
d�	d��	fd����
�fd�}��
�fd�}tj����}|�tj�|��tj|���}	d}tj��5}|���|��d�|���|j	�Y|�
|j	jt��|�
d�d	�d
�t|j	j����d}ddd��n#1swxYwY|s|��	d��|��	�
��d�|���dS#d�|���wxYw)NrFc����dz
�dS�Nr&r!)rnr��num_received_signalss  �r�custom_handlerzAStressTest.test_stress_modifying_handlers.<locals>.custom_handler9s��� �A�%� � � rc�F���stj����dz
���dSdSr�)r�raise_signal)�do_stop�num_sent_signalsrns���r�set_interruptszAStressTest.test_stress_modifying_handlers.<locals>.set_interrupts=sE����
&��#�F�+�+�+� �A�%� ��
&�
&�
&�
&�
&rc����dkr@td��D](}�tjfD]}tj�|����)�dk�>dSdS)Nr�i N)r�rr)r�r�r�r�rns  ���r�cycle_handlerszAStressTest.test_stress_modifying_handlers.<locals>.cycle_handlersCsl���"�S�(�(��u���7�7�A�$2�F�N�#C�7�7���
�f�g�6�6�6�6�7�#�S�(�(�(�(�(�(r)�targetTzSignal �dz ignored due to race condition)rrMr��	threading�Threadr�catch_unraisable_exception�startr`�
unraisabler&�	exc_valuer�rWr��
assertGreaterri)r.r�r�r|�t�ignoredr�r�r�r�r�rns       @@@@@r�test_stress_modifying_handlersz)StressTest.test_stress_modifying_handlers/s �������
����� ����	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	&�	7�	7�	7�	7�	7�	7�	7��m�F�N�;�;������
�v�{�;�;�;���N�3�3�3��	��G��3�5�5�
#�����	�	�	��� � � ����������=�,��)�)�"�-�*A�7�K�K�K��M�M�J�&�J�J�J�J��B�M�3�4�4�6�6�6�#�G�
#�
#�
#�
#�
#�
#�
#�
#�
#�
#�
#����
#�
#�
#�
#�$�
<��"�"�#7��;�;�;��O�O�0�2B�C�C�C��G�
�F�F�H�H�H�H�H���G�
�F�F�H�H�H�H���s1�7E>�BD-�!E>�-D1�1E>�4D1�51E>�>FN)r;r8r<rwr}r�r�r}r~rrr�r�rrxr�r!rrrzrz�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������3�3�-�/�/�0��0�2�2�6�6�3�2�/�/�6�6�6rrzc�f�eZdZd�Zejejdkd��d���Zd�Z	d�Z
dS)�RaiseSignalTestc��|�t��5tjtj��ddd��dS#1swxYwYdSr@)rE�KeyboardInterruptrr�rXrIs r�test_sigintzRaiseSignalTest.test_sigintms���
�
�
�0�
1�
1�	/�	/����
�.�.�.�	/�	/�	/�	/�	/�	/�	/�	/�	/�	/�	/�	/����	/�	/�	/�	/�	/�	/s�A�A�ArzWindows specific testc��	d}tj|��|�d��dS#t$r"}|jtjkrn�Yd}~dSd}~wwxYw)Nr&z#OSError (Invalid argument) expected)rr��failr��errno�EINVAL)r.rP�es   r�test_invalid_argumentz%RaiseSignalTest.test_invalid_argumentqsy��	��F����'�'�'��I�I�;�<�<�<�<�<���	�	�	��w�%�,�&�&�������������	���s�+/�
A�A�Ac���d��fd�}tjtj|��}|�tjtj|��tjtj��|����dS)NFc���d�dSrr!)�a�b�is_oks  �rr�z-RaiseSignalTest.test_handler.<locals>.handlers����E�E�Er)rrXr�r�r�)r.r��
old_signalr�s   @r�test_handlerzRaiseSignalTest.test_handler}s{�����	�	�	�	�	��]�6�=�'�:�:�
�����
�v�}�j�A�A�A���F�M�*�*�*���������rc�^�d}td|��\}}}|�d|��dS)Nz�if 1:
        import _thread
        class Foo():
            def __del__(self):
                _thread.interrupt_main()

        x = Foo()
        rrs/OSError: Signal 2 ignored due to race condition)rrW)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�NrN)r;r8r<r�r}r�r(r)r�r�r�r!rrr�r�ksy������/�/�/��X�_�S�\�W�,�.E�F�F�	�	�G�F�	�	�	�	�O�O�O�O�Orr�c�V�eZdZejeed��d��d���ZdS)�PidfdSignalTest�pidfd_send_signalzpidfd support not built inc���|�t��5}tjdtj��ddd��n#1swxYwY|jjtjkr|�d��n/|jjtj	kr|�d��|�
|jjtj��tj
dtj����tj��}|�tj|��|�t&d��5tj|tjt)��d��ddd��n#1swxYwY|�t*��5tj|tj��ddd��dS#1swxYwYdS)Nrzkernel does not support pidfdsz"Not enough privileges to use pidfsz/proc/z^siginfo must be None$)rEr�rr�rXr�r��ENOSYSr��EPERMr'�EBADFr\�openr��O_DIRECTORYr�r��assertRaisesRegexrL�objectr�)r.r��my_pidfds   r�test_pidfd_send_signalz&PidfdSignalTest.test_pidfd_send_signal�sI��
�
�
�w�
'�
'�	7�2��$�Q��
�6�6�6�	7�	7�	7�	7�	7�	7�	7�	7�	7�	7�	7����	7�	7�	7�	7�
�<����-�-��M�M�:�;�;�;�;�
�\�
�5�;�
.�
.��M�M�>�?�?�?������+�U�[�9�9�9��7�1�B�I�K�K�1�1�2�>�B�B�������(�+�+�+�
�
#�
#�I�/G�
H�
H�	K�	K��$�X�v�}�f�h�h��J�J�J�	K�	K�	K�	K�	K�	K�	K�	K�	K�	K�	K����	K�	K�	K�	K�
�
�
�0�
1�
1�	>�	>��$�X�v�}�=�=�=�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>�	>����	>�	>�	>�	>�	>�	>s5� A�A�A�	.F�F�
F�( G�G�GN)r;r8r<r}r~rrr�r!rrr�r��sR�������X�����+�,�,�$���
>�
>�	��
>�
>�
>rr�c�,�tj��dSr@)r�
reap_childrenr!rr�tearDownModuler��s��������r�__main__),r*r�r5r\r�rr�r�rvr(r�r>r}rYr�test.supportr�test.support.script_helperrrrr��ImportError�TestCaser	r�r)r>r~r�r�r�rr�r�r�rrMrzr�r�r�r;�mainr!rr�<module>r�s<��������������	�	�	�	�
�
�
�
�
�
�
�
�
�
�
�
���������
�
�
�
�������������������"�"�"�"�"�"�E�E�E�E�E�E�E�E�)�)�)�)�)�)�������������I�I�I�����/=�/=�/=�/=�/=�8�$�/=�/=�/=�d������(�*@�A�A�H=�H=�H=�H=�H=��"�H=�H=�B�A�H=�^���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���W�W�V�\�2�2�4L�M�M�@%�@%�@%�@%�@%�h�/�@%�@%�N�M�@%�F������(�*@�A�A����W�W�V�^�4�4�6S�T�T���������W�W�R��(�(�*>�?�?�Q&�Q&�Q&�Q&�Q&�x�(�Q&�Q&�@�?���U�T�B�A�Q&�h������(�*@�A�A����W�W�V�[�1�1�R�g�g�f�k�6R�6R�J�L�L�b1�b1�b1�b1�b1��"�b1�b1�L�L�B�A�b1�JP4�P4�P4�P4�P4�(�+�P4�P4�P4�f
y�y�y�y�y��"�y�y�y�x)O�)O�)O�)O�)O�h�'�)O�)O�)O�Z>�>�>�>�>�h�'�>�>�>�*����z����H�M�O�O�O�O�O��s�A�A�A