U
    luf:  ã                   @   sT   d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZm	Z	 G dd„ deƒZ
dS )é    N)ÚThread)Úmark)ÚBaseZMQTestCaseÚSkipTestc                   @   sž   e Zd ZdZdZdZeed ƒZddd„Zdd	„ Z	e
jeed
ƒ dddd„ ƒZe
jeedƒ dddd„ ƒZe
jdddd„ ƒZdd„ Zdd„ Zdd„ ZdS )ÚTestEINTRSysCallzBase class for EINTR tests.çš™™™™™¹?g      Ð?g     @@Nc                 C   sL   t tdƒstdƒ‚|dkr | j}d| _t tj| j¡| _t tj	|d¡ dS )zustart a timer to fire only once

        like signal.alarm, but with better resolution than integer seconds.
        Ú	setitimerzEINTR tests require setitimerNFiè  )
ÚhasattrÚsignalr   Úsignal_delayÚtimer_firedÚSIGALRMÚ
stop_timerÚorig_handlerr   ÚITIMER_REAL)ÚselfÚt© r   ú>/tmp/pip-unpacked-wheel-h6ekxre8/zmq/tests/test_retry_eintr.pyÚalarm   s    
zTestEINTRSysCall.alarmc                 G   s*   d| _ t tjdd¡ t tj| j¡ d S )NTr   )r   r
   r   r   r   r   )r   Úargsr   r   r   r   '   s    zTestEINTRSysCall.stop_timerZRCVTIMEOzrequires RCVTIMEO)Úreasonc                 C   s:   |   tj¡}| j|_|  ¡  |  tj|j¡ | j	s6t
‚d S )N)ÚsocketÚzmqZPULLÚ
timeout_msZrcvtimeor   ÚassertRaisesÚAgainÚrecvr   ÚAssertionError)r   Úpullr   r   r   Útest_retry_recv,   s
    z TestEINTRSysCall.test_retry_recvZSNDTIMEOzrequires SNDTIMEOc                 C   s<   |   tj¡}| j|_|  ¡  |  tj|jd¡ | j	s8t
‚d S )Ns   buf)r   r   ÚPUSHr   Zsndtimeor   r   r   Úsendr   r   ©r   Úpushr   r   r   Útest_retry_send4   s
    z TestEINTRSysCall.test_retry_sendé   )Zrerunsc                    sˆ   ˆ   ¡ \}‰t ¡ }| |tj¡ ˆ  ¡  ‡ ‡fdd„}t|d}| ¡  t| 	dˆ j
 ¡ƒ}| ¡  ||ksrt‚ˆ js|t‚| ¡  d S )Nc                      s   t  dˆ j ¡ ˆ d¡ d S )Né   ó   ping)ÚtimeÚsleepr   r"   r   ©r   Úyr   r   r"   C   s    z.TestEINTRSysCall.test_retry_poll.<locals>.send)Útargetr'   )Zcreate_bound_pairr   ZPollerÚregisterÚPOLLINr   r   ÚstartÚdictÚpollr   Újoinr   r   r   )r   ÚxZpollerr"   r   Zevtsr   r+   r   Útest_retry_poll<   s    

z TestEINTRSysCall.test_retry_pollc                 C   s^   |   tj¡}| j|_| d¡ | d¡ t d¡ |  	¡  | j
 ¡  | jsNt‚| j
jsZt‚d S )Nztcp://127.0.0.1:5555r(   r   )r   r   r!   r   ZlingerÚconnectr"   r)   r*   r   ÚcontextÚdestroyr   r   Úclosedr#   r   r   r   Útest_retry_termO   s    




z TestEINTRSysCall.test_retry_termc                 C   s   t dƒ‚d S )Nz(TODO: find a way to interrupt getsockopt©r   ©r   r   r   r   Útest_retry_getsockoptZ   s    z&TestEINTRSysCall.test_retry_getsockoptc                 C   s   t dƒ‚d S )Nz(TODO: find a way to interrupt setsockoptr;   r<   r   r   r   Útest_retry_setsockopt]   s    z&TestEINTRSysCall.test_retry_setsockopt)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtimeoutÚintr   r   r   r   Zskipifr	   r   r    r%   Zflakyr5   r:   r=   r>   r   r   r   r   r      s   




r   )r
   r)   Ú	threadingr   Zpytestr   r   Z	zmq.testsr   r   r   r   r   r   r   Ú<module>   s   