
    ye                        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 	 d dlZd dlmZ d	Zn# e$ r d
ZY nw xY w ej                    dk    Zd Z ej        ed          Z ej         ej                    dk     d          Zd Z  G d de          Z! G d de!          Z" G d d          Z#d Z$dS )    N)partial)Thread)List)SkipTestTestCase)mark)jsonapi)greenTFPyPyc                     | S N )xs    2lib/python3.11/site-packages/zmq/tests/__init__.py<lambda>r   $   s         zDoesn't work on PyPy)reason)   zrequires zmq >= 4c                    t          | 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   ts      r   term_contextr'   .   s{    chAAHGGIIIFF7Fzz|| 
.2	!+M
 
 	

 
r   c                   6    e Zd ZU dZdZ eej                            d          pd          Z	e
ej                 ed<   ed             Zed             Zed             Zd	 Zd
 Z fdZ fdZej        ej        dfdZd Zd Zd Zd Zd Zd Zd Z xZS )BaseZMQTestCaseF
   ZMQ_TEST_TIMEOUT<   socketsc                     | j         j                            dd          d         t                              dd          d         k    S )N.   r   )	__class__
__module__split__name__selfs    r   _is_pyzmq_testzBaseZMQTestCase._is_pyzmq_testB   s<    ~(..sA66q9X^^CQR=S=STU=VVVr   c                 H    | j         ot          t          d          o| j        S )NSIGALRM)r7   hasattrsignaltest_timeout_secondsr5   s    r   _should_test_timeoutz$BaseZMQTestCase._should_test_timeoutF   s,      *	***)	
r   c                 @    | j         rt          j        S t          j        S r   )r
   gzmqr"   r   r5   s    r   r"   zBaseZMQTestCase.ContextN   s    : 	<;r   c                 n    | j                             |          }| j                            |           |S r   )r!   socketr-   append)r6   socket_typess      r   rA   zBaseZMQTestCase.socketU   s2    L,,Ar   c                 (    t          d| d          )NzTest did not complete in z seconds)TimeoutError)r6   r   argss      r   _alarm_timeoutzBaseZMQTestCase._alarm_timeoutZ   s    HwHHHIIIr   c                    t                                                       | j        st          j        dt
          d           | j        rt          st          d          | j	        
                                | _        g | _        | j        rRt          j        t          j        t!          | j        | j                             t          j        | 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setUpr7   warningswarnDeprecationWarningr
   have_geventr   r"   instancer!   r-   r=   r;   r9   r   rH   r<   alarm)r6   r1   s    r   rM   zBaseZMQTestCase.setUp]   s    " 	M{"   
 : 	.k 	.,---|,,..$ 	4M(;T=V W W   L233333	4 	4r   c                    | j         rt          j        d           | j        h}| j        rO| j                                        }|                    |j                   |                    d           | j        O|D ]B}	 t          || j	                   # t          $ r d t          j        j        j        _         w xY wt                                                       d S )Nr   )r=   r;   rS   r!   r-   popaddcloser'   teardown_timeout	Exceptionr   r    r"   r#   rL   tearDown)r6   contextssockr%   r1   s       r   rZ   zBaseZMQTestCase.tearDownq   s    $ 	LOOOL>l 	<##%%DLL&&&JJqMMM l 	  	 	CS$"78888   6:	!)3
 	s    B'B=ztcp://127.0.0.1c                    | 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!   rA   
setsockoptr   LINGERbind_to_random_portconnectr-   extend)r6   type1type2	interfaces1ports2s          r   create_bound_pairz!BaseZMQTestCase.create_bound_pair   s     \  ''
cj!$$$%%i00\  ''
cj!$$$


i(($(()))RH%%%2vr   c                     |                     |           |                                }|                     |           |                                }|S r   )sendrecv)r6   rg   ri   msgmsg2msg3s         r   	ping_pongzBaseZMQTestCase.ping_pong   s?    
wwyy
wwyyr   c                     t           j        t          d          |                    |           |                                }|                    |           |                                }|S )NzNo json library)r	   jsonmodr   	send_json	recv_jsonr6   rg   ri   oo2o3s         r   ping_pong_jsonzBaseZMQTestCase.ping_pong_json   sY    ?",---
Q\\^^
R\\^^	r   c                     |                     |           |                                }|                     |           |                                }|S r   )
send_pyobj
recv_pyobjrv   s         r   ping_pong_pyobjzBaseZMQTestCase.ping_pong_pyobj   sE    
a]]__
b]]__	r   c                    	  ||i | |                      d           d S # t          j        $ rW}|                     |j        |dt          j        |          dt          j        |j                  d           Y d }~d S d }~ww xY w)N Function did not raise any errorwrong error raised, expected '' got '')failr   ZMQErrorassertEqualerrnor6   r   funcrG   kwargses         r   assertRaisesErrnoz!BaseZMQTestCase.assertRaisesErrno   s    	:D$!&!!! II899999 | 	 	 	 <&&&&QW(=(=(=(=?        	s   ! BABBc           	      p   t          j                    dk    rt          j        d           t          j        |gg g |                    dd                    \  }}}t          |          dk    s
J d            t           j        |                    dd          z  |d<   |r|j	        n|j
        } |d	i |S )
zIcall recv[_multipart] in a way that raises if there is nothing to receive)rJ   r0   r   g?r      r   r   zShould have received a messageflagsr   )r   zmq_version_infotimesleepselectrU   lenDONTWAITgetrecv_multipartrm   )r6   	multipartrA   r   rwr   rm   s           r   _select_recvzBaseZMQTestCase._select_recv   s    !!Y.. JsOOO*fXr2vzz)Q7O7OPPP1a1vvzzz;zzz,GQ)?)??w(1Bv$$v{t~~f~~r   c                       | j         d|fi |S )z=call recv in a way that raises if there is nothing to receiveFr   r6   rA   r   s      r   rm   zBaseZMQTestCase.recv   s     t 99&999r   c                       | j         d|fi |S )zGcall recv_multipart in a way that raises if there is nothing to receiveTr   r   s      r   r   zBaseZMQTestCase.recv_multipart   s     t v88888r   ) r4   r2   __qualname__r
   rX   intosenvironr   r<   r   r   Socket__annotations__propertyr7   r=   r"   rA   rH   rM   rZ   PAIRrj   rq   rz   r~   r   r   rm   r   __classcell__)r1   s   @r   r)   r)   <   s        E3rz~~.@AAGRHH#*W W XW 
 
 X
   X  
J J J4 4 4 4 4(    ( HCH8I         : : :  : : :9 9 9 9 9 9 9r   r)   c                       e Zd ZdS )PollZMQTestCaseN)r4   r2   r   r   r   r   r   r      s        Dr   r   c                   ,    e Zd ZdZdZdZd Zd Zd ZdS )	GreenTestz/Mixin for making green versions of test classesTr*   c                 v   |t           j        k    rt          d          	  ||i | |                     d           d S # t           j        $ ri t          j                    d         }|                     |j        |dt          j        |          dt          j        |j                  d           Y d S w xY w)NzSkipping because we're green.r   r0   r   r   r   )	r   EAGAINr   r   r   sysexc_infor   r   r   s         r   r   zGreenTest.assertRaisesErrno   s    CJ:;;;	:D$!&!!! II899999 | 	 	 	q!A <&&&&QW(=(=(=(=?     	s   A   A4B87B8c                    | j         rt          j        d           | j        h}| j        rN| j                                        }|                    |j                   |                                 | j        N	 t          j	        d |D             | j
        d           d S # t          j        $ r t          d          w xY w)Nr   c                 @    g | ]}t          j        |j                  S r   )geventspawnr   ).0r%   s     r   
<listcomp>z&GreenTest.tearDown.<locals>.<listcomp>   s$    <<<Cch''<<<r   T)r   raise_errorr   )r=   r;   rS   r!   r-   rU   rV   rW   r   joinallrX   Timeoutr$   )r6   r[   r\   s      r   rZ   zGreenTest.tearDown   s    $ 	LOOOL>l 	<##%%DLL&&&JJLLL l 			N<<8<<<-      
 ~ 	 	 	Q  	s   :&B" "Cc                      t          d          NzSkipping because we are green)r   r5   s    r   
skip_greenzGreenTest.skip_green   s    6777r   N)	r4   r2   r   __doc__r
   rX   r   rZ   r   r   r   r   r   r      sR        99E: : :"  (8 8 8 8 8r   r   c                       fd}|S )Nc                 H    | j         rt          d           | g|R i |S r   )r
   r   )r6   rG   r   fs      r   skipping_testz!skip_green.<locals>.skipping_test  s<    : 	,:;;;1T+D+++F+++r   r   )r   r   s   ` r   r   r     s$    , , , , , r   )%r   platformr;   r   r   rN   	functoolsr   	threadingr   typingr   unittestr   r   pytestr   r   	zmq.utilsr	   r   r
   r?   rQ   ImportErrorpython_implementationPYPY_idskipif	skip_pypyr   require_zmq_4r'   r)   r   r   r   r   r   r   <module>r      s   
			   



                     ' ' ' ' ' ' ' '       



      MMM!!!!!!KK   KKK &x%''61 kDK%;<<<	0C022T9BUVVV
 
 
O9 O9 O9 O9 O9h O9 O9 O9d	 	 	 	 	o 	 	 	,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8^    s   A AA