o
    ZhD                     @   s>  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y[   d
ZY nw e dkZede 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PyPyzYzmq.tests is deprecated in pyzmq 25, we recommend managing your own contexts and sockets.c                 C   s   | S N )xr   r   I/var/www/html/lang_env/lib/python3.10/site-packages/zmq/tests/__init__.py_id)   s   r   zDoesn't work on PyPy)reason)   zrequires zmq >= 4c                 C   sF   t | jd}d|_|  |j|d | r!d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_context5   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_testI   s   $zBaseZMQTestCase._is_pyzmq_testc                 C   s   | j o
ttdo
| jS )NSIGALRM)r0   hasattrsignaltest_timeout_secondsr.   r   r   r   _should_test_timeoutM   s
   z$BaseZMQTestCase._should_test_timeoutc                 C   s   | j rtjS tjS r   )r	   gzmqr   r   r.   r   r   r   r   U   s   zBaseZMQTestCase.Contextc                 C   s   | j |}| j| |S r   )r   socketr'   append)r/   socket_typesr   r   r   r7   \   s   zBaseZMQTestCase.socketc                 G   s   t d| d)NzTest did not complete in z seconds)TimeoutError)r/   r   argsr   r   r   _alarm_timeouta   s   zBaseZMQTestCase._alarm_timeoutc                    s`   t    | jrtstd| j | _g | _| j	r.t

t
jt| j| j t
| j d S d S )Nzrequires gevent)supersetUpr	   have_geventr   r   instancer   r'   r5   r3   r1   r   r=   r4   alarmr.   r*   r   r   r?   d   s   

zBaseZMQTestCase.setUpc              	      s   | j rtd | jh}| jr"| j }||j |d | js|D ]}zt|| j	 W q$ t
y<   d tjjj_ w t   d S )Nr   )r5   r3   rB   r   r'   popaddcloser#   teardown_timeout	Exceptionr   r   r   r   r>   tearDown)r/   contextssockr!   rC   r   r   rI   r   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   r7   
setsockoptr   ZLINGERZbind_to_random_portconnectr'   extend)r/   Ztype1Ztype2	interfaces1ports2r   r   r   create_bound_pair   s   
z!BaseZMQTestCase.create_bound_pairc                 C   (   | | | }| | | }|S r   )sendrecv)r/   rQ   rS   msgZmsg2Zmsg3r   r   r   	ping_pong   
   

zBaseZMQTestCase.ping_pongc                 C   s:   t jd u r	td|| | }|| | }|S )NzNo json library)r   Zjsonmodr   Z	send_jsonZ	recv_jsonr/   rQ   rS   oo2Zo3r   r   r   ping_pong_json   s   


zBaseZMQTestCase.ping_pong_jsonc                 C   rU   r   )Z
send_pyobjZ
recv_pyobjr[   r   r   r   ping_pong_pyobj   rZ   zBaseZMQTestCase.ping_pong_pyobjc                 O   sv   z	||i | W n* t jy3 } z| |j|dt | dt |j d W Y d }~d S d }~ww | d d S )Nwrong error raised, expected '' got '' Function did not raise any error)r   ZMQErrorassertEqualerrnofailr/   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s&J dt j|ddB |d< |r6|j	n|j
}|d
i |S )zIcall recv[_multipart] in a way that raises if there is nothing to receive)   r)   r   g?r      r   r   zShould have received a messageflagsNr   )r   zmq_version_infotimesleepselectrD   lenZDONTWAITgetrecv_multipartrW   )r/   	multipartr7   rj   rwr   rW   r   r   r   _select_recv   s   
"zBaseZMQTestCase._select_recvc                 K      | j d|fi |S )z=call recv in a way that raises if there is nothing to receiveFrz   r/   r7   rj   r   r   r   rW         zBaseZMQTestCase.recvc                 K   r{   )zGcall recv_multipart in a way that raises if there is nothing to receiveTr|   r}   r   r   r   rv      r~   zBaseZMQTestCase.recv_multipart) r-   r+   __qualname__r	   rG   intosenvironru   r4   r   r   ZSocket__annotations__propertyr0   r5   r   r7   r=   r?   rI   ZPAIRrT   rY   r^   r_   rl   rz   rW   rv   __classcell__r   r   rC   r   r$   C   s0   
 




	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   s   |t jkr	tdz	||i | W n' t jy9   t d }| |j|dt | dt |j d Y d S w | d d S )NzSkipping because we're green.r)   r`   ra   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 |  | jsztj	dd |D | j
dd W d S  tjy>   tdw )Nr   c                 S   s   g | ]}t |jqS r   )geventZspawnr   ).0r!   r   r   r   
<listcomp>   s    z&GreenTest.tearDown.<locals>.<listcomp>T)r   Zraise_errorr   )r5   r3   rB   r   r'   rD   rE   rF   r   ZjoinallrG   Timeoutr    )r/   rJ   rK   r   r   r   rI      s&   

zGreenTest.tearDownc                 C   s   t dNzSkipping because we are green)r   r.   r   r   r   
skip_green   s   zGreenTest.skip_greenN)	r-   r+   r   __doc__r	   rG   rl   rI   r   r   r   r   r   r      s    r   c                    s    fdd}|S )Nc                    s$   | j rtd | g|R i |S r   )r	   r   )r/   r<   rj   fr   r   skipping_test  s   z!skip_green.<locals>.skipping_testr   )r   r   r   r   r   r      s   r   )'r   platformr3   r   rq   warnings	functoolsr   	threadingr   typingr   Zunittestr   r   Zpytestr   r   Z	zmq.utilsr   r   r	   r6   r@   ImportErrorpython_implementationPYPYwarnDeprecationWarningr   ZskipifZ	skip_pypyrp   Zrequire_zmq_4r#   r$   r   r   r   r   r   r   r   <module>   sD    .