U
    
W[_  ã                   @   sŽ   d Z ddlmZm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 edkrvddlmZ dd	lmZmZ nd
ZG dd„ deƒZdS )zX
Tests for L{twisted.internet._sigchld}, an alternate, superior SIGCHLD
monitoring API.
é    )ÚdivisionÚabsolute_importN)ÚplatformType)Úmsg)ÚSynchronousTestCaseÚposix)ÚsetNonBlocking)ÚinstallHandlerÚisDefaultHandlerz,These tests can only run on POSIX platforms.c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚSetWakeupSIGCHLDTestszy
    Tests for the L{signal.set_wakeup_fd} implementation of the
    L{installHandler} and L{isDefaultHandler} APIs.
    c                 C   s@   t  ¡ \}}|  t j|¡ |  t j|¡ t|ƒ t|ƒ ||fS )zk
        Create a non-blocking pipe which will be closed after the currently
        running test.
        )ÚosÚpipeZ
addCleanupÚcloser   ©ÚselfÚreadÚwrite© r   úD/usr/lib/python3/dist-packages/twisted/internet/test/test_sigchld.pyr      s    zSetWakeupSIGCHLDTests.pipec                 C   sj   t  t j¡}|t jkr.|| _t   t jt j¡ nd| _tdƒ| _| jdk	rf| jdkrftd| j| jf ƒ dS )z
        Save the current SIGCHLD handler as reported by L{signal.signal} and
        the current file descriptor registered with L{installHandler}.
        Néÿÿÿÿz<Previous test didn't clean up after its SIGCHLD setup: %r %r)ÚsignalÚ	getsignalÚSIGCHLDÚSIG_DFLÚsignalModuleHandlerr	   ÚoldFDr   )r   Zhandlerr   r   r   ÚsetUp*   s    


ÿzSetWakeupSIGCHLDTests.setUpc                 C   sL   t dƒ t tjtj¡ | jdk	r4t tj| j¡ n| jdkrHt | jƒ dS )zM
        Restore whatever signal handler was present when setUp ran.
        r   N)r	   r   r   r   r   r   ©r   r   r   r   ÚtearDown=   s    

zSetWakeupSIGCHLDTests.tearDownc                 C   sf   |   tƒ ¡ t tjtj¡ |  tƒ ¡ t tjtj¡ |   tƒ ¡ t tjdd„ ¡ |  tƒ ¡ dS )zn
        L{isDefaultHandler} returns true if the SIGCHLD handler is SIG_DFL,
        false otherwise.
        c                  W   s   d S )Nr   )Úargsr   r   r   Ú<lambda>V   ó    z=SetWakeupSIGCHLDTests.test_isDefaultHandler.<locals>.<lambda>N)Ú
assertTruer
   r   r   ÚSIG_IGNÚassertFalser   r   r   r   r   Útest_isDefaultHandlerL   s    z+SetWakeupSIGCHLDTests.test_isDefaultHandlerc                 C   s(   |   ¡ \}}t|ƒ}|  t|ƒ|¡ dS )zV
        L{installHandler} returns the previously registered file descriptor.
        N)r   r	   ÚassertEqual)r   r   r   r   r   r   r   Útest_returnOldFDZ   s    z&SetWakeupSIGCHLDTests.test_returnOldFDc                 C   sD   |   ¡ \}}|  tƒ ¡ t|ƒ |  tƒ ¡ tdƒ |  tƒ ¡ dS )zO
        C{installHandler(-1)} removes the SIGCHLD handler completely.
        r   N)r   r"   r
   r	   r$   r   r   r   r   Útest_uninstallHandlerc   s    z+SetWakeupSIGCHLDTests.test_uninstallHandlerc                 C   sd   |   ¡ \}}t|ƒ |  ttj|d¡}|  |jtj¡ t 	t 
¡ tj¡ |  tt |d¡ƒd¡ dS )zŒ
        The file descriptor passed to L{installHandler} has a byte written to
        it when SIGCHLD is delivered to the process.
        é   é   N)r   r	   ZassertRaisesÚOSErrorr   r   r&   ÚerrnoZEAGAINÚkillÚgetpidr   r   Úlen)r   r   r   Úexcr   r   r   Útest_installHandlero   s    z)SetWakeupSIGCHLDTests.test_installHandlerN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r%   r'   r(   r1   r   r   r   r   r      s   	r   )r5   Z
__future__r   r   r   r   r,   Ztwisted.python.runtimer   Ztwisted.python.logr   Ztwisted.trial.unittestr   Ztwisted.internet.fdescr   Ztwisted.internet._signalsr	   r
   Úskipr   r   r   r   r   Ú<module>   s   