o
    ٷi                     @   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   F/home/ubuntu/.local/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
   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)r1   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)r0   socket_typesr   r   r   r8   \   s   zBaseZMQTestCase.socketc                 G   s   t d| d)NzTest did not complete in z seconds)TimeoutError)r0   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(   r6   r4   r2   r   r>   r5   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   )r6   r4   rC   r   r(   popaddcloser#   teardown_timeout	Exceptionr   r   r   r   r?   tearDown)r0   contextssockr!   rD   r   r   rJ   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   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   rV   rX   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   rV   rX   oo2o3r   r   r   ping_pong_json   s   


zBaseZMQTestCase.ping_pong_jsonc                 C   rZ   r   )
send_pyobj
recv_pyobjre   r   r   r   ping_pong_pyobj   ra   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r0   rs   funcr=   kwargser   r   r   assertRaisesErrno   s   
z!BaseZMQTestCase.assertRaisesErrnoc                 K   st   t d tj|gg g |ddd\}}}t|dks J dtj|ddB |d< |r0|jn|j	}|d	i |S )
zIcall recv[_multipart] in a way that raises if there is nothing to receiveg?r      r   r   zShould have received a messageflagsNr   )
timesleepr   selectrE   lenDONTWAITgetrecv_multipartr\   )r0   	multipartr8   rw   rwr   r\   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   rw   r   r   r   r\         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	   rH   intosenvironr   r5   r   r   Socket__annotations__propertyr1   r6   r   r8   r>   r@   rJ   PAIRrY   r`   ri   rl   ry   r   r\   r   __classcell__r   r   rD   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*   rm   rn   ro   rp   )	r   EAGAINr   rq   sysexc_inforr   rs   rt   ru   r   r   r   ry      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   rC   r   r(   rE   rF   rG   r   joinallrH   Timeoutr    )r0   rK   rL   r   r   r   rJ      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	   rH   ry   rJ   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=   rw   fr   r   skipping_test   s   z!skip_green.<locals>.skipping_testr   )r   r   r   r   r   r      s   r   )'r   platformr4   r   r|   warnings	functoolsr   	threadingr   typingr   unittestr   r   pytestr   r   	zmq.utilsr   r   r	   r7   rA   ImportErrorpython_implementationPYPYwarnDeprecationWarningr   skipif	skip_pypyzmq_version_inforequire_zmq_4r#   r$   r   r   r   r   r   r   r   <module>   sD    .