U
    luf                     @   s4  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 d dlmZmZ d dlmZ d dlZd dlmZ zd dlZd dlmZ d	ZW n ek
r   d
ZY nX e dkZdd ZejeddZeje dk ddZdd Z G dd deZ!G dd de!Z"G dd dZ#dd Z$dS )    N)partial)Thread)List)SkipTestTestCase)mark)jsonapi)greenTFPyPyc                 C   s   | S N )xr   r   6/tmp/pip-unpacked-wheel-h6ekxre8/zmq/tests/__init__.py<lambda>$       r   zDoesn't work on PyPy)reason)   zrequires zmq >= 4c                 C   sF   t | jd}d|_|  |j|d | rBdtjjj	_
tddS )z"Terminate a context with a timeout)targetTtimeoutN?context could not terminate, open sockets likely remain in test)r   termdaemonstartjoinis_alivezmqsugarcontextContext	_instanceRuntimeError)ctxr   tr   r   r   term_context.   s    r$   c                       s   e Zd ZU dZdZeejdp"dZ	e
ej ed< edd Zedd	 Zed
d Zdd Zdd Z fddZ fddZejejdfddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Z  ZS )%BaseZMQTestCaseF
   ZZMQ_TEST_TIMEOUT<   socketsc                 C   s$   | j jddd tddd kS )N.   r   )	__class__
__module__split__name__selfr   r   r   _is_pyzmq_testB   s    zBaseZMQTestCase._is_pyzmq_testc                 C   s   | j ottdo| jS )NSIGALRM)r1   hasattrsignaltest_timeout_secondsr/   r   r   r   _should_test_timeoutF   s
    z$BaseZMQTestCase._should_test_timeoutc                 C   s   | j rtjS tjS d S r   )r	   gzmqr   r   r/   r   r   r   r   N   s    zBaseZMQTestCase.Contextc                 C   s   | j |}| j| |S r   )r   socketr(   append)r0   socket_typesr   r   r   r8   U   s    zBaseZMQTestCase.socketc                 G   s   t d| dd S )NzTest did not complete in z seconds)TimeoutError)r0   r   argsr   r   r   _alarm_timeoutZ   s    zBaseZMQTestCase._alarm_timeoutc                    sr   t    | js tjdtdd | jr2ts2td| j	
 | _g | _| jrnttjt| j| j t| j d S )Nzizmq.tests.BaseZMQTestCase is deprecated in pyzmq 25, we recommend managing your own contexts and sockets.   )
stacklevelzrequires gevent)supersetUpr1   warningswarnDeprecationWarningr	   have_geventr   r   instancer   r(   r6   r4   r2   r   r>   r5   alarmr/   r+   r   r   rB   ]   s"    

 zBaseZMQTestCase.setUpc              	      s   | j rtd | jh}| jr@| j }||j |d q|D ]8}zt|| j	 W qD t
k
rz   d tjjj_ Y qDX qDt   d S )Nr   )r6   r4   rH   r   r(   popaddcloser$   teardown_timeout	Exceptionr   r   r   r    rA   tearDown)r0   contextssockr"   rI   r   r   rO   q   s    


zBaseZMQTestCase.tearDownztcp://127.0.0.1c                 C   sj   | j |}|tjd ||}| j |}|tjd || d|  | j||g ||fS )z/Create a bound socket pair using a random port.r   :)	r   r8   
setsockoptr   ZLINGERZbind_to_random_portconnectr(   extend)r0   Ztype1Ztype2Z	interfaces1ports2r   r   r   create_bound_pair   s    
z!BaseZMQTestCase.create_bound_pairc                 C   s(   | | | }| | | }|S r   )sendrecv)r0   rV   rX   msgZmsg2Zmsg3r   r   r   	ping_pong   s
    

zBaseZMQTestCase.ping_pongc                 C   s:   t jd krtd|| | }|| | }|S )NzNo json library)r   Zjsonmodr   Z	send_jsonZ	recv_jsonr0   rV   rX   oZo2Zo3r   r   r   ping_pong_json   s    


zBaseZMQTestCase.ping_pong_jsonc                 C   s(   | | | }| | | }|S r   )Z
send_pyobjZ
recv_pyobjr^   r   r   r   ping_pong_pyobj   s
    

zBaseZMQTestCase.ping_pong_pyobjc                 O   sh   z||| W nJ t jk
rX } z*| |j|dt |t |jf  W 5 d }~X Y nX | d d S )N*wrong error raised, expected '%s' got '%s' Function did not raise any error)r   ZMQErrorassertEqualerrnofailr0   rf   funcr=   kwargser   r   r   assertRaisesErrno   s    z!BaseZMQTestCase.assertRaisesErrnoc                 K   s|   t  dkrtd t j|gg g |ddd\}}}t|dksLtdt j|	ddB |d< |rl|j
n|j}|f |S )	zIcall recv[_multipart] in a way that raises if there is nothing to receive)r?   r*   r   g?r      r   r   zShould have received a messageflags)r   zmq_version_infotimesleepselectrJ   lenAssertionErrorZDONTWAITgetrecv_multipartr[   )r0   	multipartr8   rj   rwr   r[   r   r   r   _select_recv   s    
"zBaseZMQTestCase._select_recvc                 K   s   | j d|f|S )z=call recv in a way that raises if there is nothing to receiveFrz   r0   r8   rj   r   r   r   r[      s    zBaseZMQTestCase.recvc                 K   s   | j d|f|S )zGcall recv_multipart in a way that raises if there is nothing to receiveTr{   r|   r   r   r   rv      s    zBaseZMQTestCase.recv_multipart) r.   r,   __qualname__r	   rM   intosenvironru   r5   r   r   ZSocket__annotations__propertyr1   r6   r   r8   r>   rB   rO   ZPAIRrY   r]   r`   ra   rl   rz   r[   rv   __classcell__r   r   rI   r   r%   <   s2   



  
	r%   c                   @   s   e Zd ZdS )PollZMQTestCaseN)r.   r,   r}   r   r   r   r   r      s   r   c                   @   s0   e Zd ZdZdZdZdd Zdd Zdd	 Zd
S )	GreenTestz/Mixin for making green versions of test classesTr&   c                 O   sx   |t jkrtdz||| W nH t jk
rh   t d }| |j|dt |t |jf  Y nX | d d S )NzSkipping because we're green.r*   rb   rc   )	r   EAGAINr   rd   sysexc_infore   rf   rg   rh   r   r   r   rl      s    

zGreenTest.assertRaisesErrnoc                 C   s   | j rtd | jh}| jr>| j }||j |  qz tj	dd |D | j
dd W n tjk
r|   tdY nX d S )Nr   c                 S   s   g | ]}t |jqS r   )geventspawnr   ).0r"   r   r   r   
<listcomp>   s     z&GreenTest.tearDown.<locals>.<listcomp>T)r   Zraise_errorr   )r6   r4   rH   r   r(   rJ   rK   rL   r   ZjoinallrM   Timeoutr!   )r0   rP   rQ   r   r   r   rO      s"    



zGreenTest.tearDownc                 C   s   t dd S NzSkipping because we are green)r   r/   r   r   r   
skip_green   s    zGreenTest.skip_greenN)	r.   r,   r}   __doc__r	   rM   rl   rO   r   r   r   r   r   r      s   r   c                    s    fdd}|S )Nc                    s$   | j rtdn | f||S d S r   )r	   r   )r0   r=   rj   fr   r   skipping_test  s    
z!skip_green.<locals>.skipping_testr   )r   r   r   r   r   r     s    r   )%r   platformr4   r   rp   rC   	functoolsr   	threadingr   typingr   Zunittestr   r   Zpytestr   r   Z	zmq.utilsr   r   r	   r7   rF   ImportErrorpython_implementationZPYPYZ_idZskipifZ	skip_pypyro   Zrequire_zmq_4r$   r%   r   r   r   r   r   r   r   <module>   s8   
 /