o
    i                     @   s2  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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   M/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/zmq/tests/__init__.py<lambda>$   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_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
   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 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)NzTest did not complete in z seconds)TimeoutError)r0   r   argsr   r   r   _alarm_timeoutZ   s   zBaseZMQTestCase._alarm_timeoutc                    sv   t    | jstjdtdd | jrtstd| j	
 | _g | _| jr9ttjt| j| j t| j d S 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 | js|D ]}zt|| j	 W q$ t
y<   d tjjj_ w t   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   LINGERbind_to_random_portconnectr(   extend)r0   type1type2	interfaces1ports2r   r   r   create_bound_pair   s   
z!BaseZMQTestCase.create_bound_pairc                 C   (   | | | }| | | }|S r   )sendrecv)r0   r[   r]   msgmsg2msg3r   r   r   	ping_pong   
   

zBaseZMQTestCase.ping_pongc                 C   s:   t jd u r	td|| | }|| | }|S )NzNo json library)r   jsonmodr   	send_json	recv_jsonr0   r[   r]   oo2o3r   r   r   ping_pong_json   s   


zBaseZMQTestCase.ping_pong_jsonc                 C   r_   r   )
send_pyobj
recv_pyobjrj   r   r   r   ping_pong_pyobj   rf   zBaseZMQTestCase.ping_pong_pyobjc                 O   sp   z	||i | W n' t jy0 } z| |j|dt |t |jf  W Y d }~d S d }~ww | d d S )N*wrong error raised, expected '%s' got '%s' Function did not raise any error)r   ZMQErrorassertEqualerrnofailr0   rv   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*   r   g?r      r   r   zShould have received a messageflagsNr   )r   zmq_version_infotimesleepselectrJ   lenDONTWAITgetrecv_multipartra   )r0   	multipartr8   rz   rwr   ra   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r   r0   r8   rz   r   r   r   ra         zBaseZMQTestCase.recvc                 K   r   )zGcall recv_multipart in a way that raises if there is nothing to receiveTr   r   r   r   r   r      r   zBaseZMQTestCase.recv_multipart) r.   r,   __qualname__r	   rM   intosenvironr   r5   r   r   Socket__annotations__propertyr1   r6   r   r8   r>   rB   rO   PAIRr^   re   rn   rq   r|   r   ra   r   __classcell__r   r   rI   r   r$   <   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y6   t d }| |j|dt |t |jf  Y d S w | d d S )NzSkipping because we're green.r*   rr   rs   )	r   EAGAINr   rt   sysexc_inforu   rv   rw   rx   r   r   r   r|      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   )geventspawnr   ).0r!   r   r   r   
<listcomp>   s    z&GreenTest.tearDown.<locals>.<listcomp>T)r   raise_errorr   )r6   r4   rH   r   r(   rJ   rK   rL   r   joinallrM   Timeoutr    )r0   rP   rQ   r   r   r   rO      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	   rM   r|   rO   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   )r0   r=   rz   fr   r   skipping_test  s   z!skip_green.<locals>.skipping_testr   )r   r   r   r   r   r     s   r   )%r   platformr4   r   r   rC   	functoolsr   	threadingr   typingr   unittestr   r   pytestr   r   	zmq.utilsr   r   r	   r7   rF   ImportErrorpython_implementationPYPY_idskipif	skip_pypyr   require_zmq_4r#   r$   r   r   r   r   r   r   r   <module>   s<    /