o
    ¹¼tf81  ã                   @   s¼   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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mZmZmZ G dd„ dejƒZG d	d
„ d
ejƒZG dd„ deƒZdS )é    N)ÚQueue)ÚEventÚThread)Úmock)Úmark)ÚPYPYÚBaseZMQTestCaseÚ	GreenTestÚSkipTestc                       s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚKwargTestSocketNc                    s$   |  dd ¡| _tƒ j|i |¤Ž d S )NÚ
test_kwarg)ÚpopÚtest_kwarg_valueÚsuperÚ__init__)ÚselfÚargsÚkwargs©Ú	__class__© ú_/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/zmq/tests/test_context.pyr      s   zKwargTestSocket.__init__)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__r   r   r   r   r      s    r   c                   @   s   e Zd ZeZdS )ÚKwargTestContextN)r   r   r   r   Z_socket_classr   r   r   r   r      ó    r   c                   @   s.  e Zd Zdd„ ZdZdd„ Zdd„ Zeje	du d	d
dd„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zejej d%¡d&d
d'd(„ ƒZd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Z d5d6„ Z!d7d8„ Z"d9d:„ Z#d;d<„ Z$ejej d%¡d=d
d>d?„ ƒZ%dS )@ÚTestContextc                 C   sd   |   ¡ }t|| j ƒsJ ‚| ¡  |   ¡ }t|| j ƒsJ ‚| ¡  |   ¡ }t|| j ƒs,J ‚| ¡  d S ©N)ÚContextÚ
isinstanceÚterm)r   Úc1Úc2Úc3r   r   r   Ú	test_init!   s   zTestContext.test_initzzmq.Contextc              
   C   s  |   ¡ `}| j› dt|ƒv sJ ‚dt|ƒvsJ ‚| tj¡6}| j› dt|ƒv s,J ‚| tj¡}| j› dt|ƒv s?J ‚W d   ƒ n1 sIw   Y  W d   ƒ n1 sXw   Y  W d   ƒ n1 sgw   Y  | j› dt|ƒv sxJ ‚dt|ƒv s€J ‚d S )Nz()Úclosedz
(1 socket)z(2 sockets))r    Ú	_repr_clsÚreprÚsocketÚzmqÚPUSHÚPULL)r   ÚctxÚpushÚpullr   r   r   Ú	test_repr.   s   
ÿ€þ€ýzTestContext.test_reprc                 C   s@   |   ¡ }dt|ƒv sJ ‚t ¡ dkrdt|ƒv sJ ‚| ¡  d S )Nr*   ©é   Z
IO_THREADS)r    Údirr+   Úzmq_version_infor"   ©r   r.   r   r   r   Útest_dir9   s
   zTestContext.test_dirNzrequires unittest.mock)Úreasonc                 C   s   t j| jd}d S )N)Úspec)r   ZMockÚcontext)r   Úmr   r   r   Útest_mockable@   s   zTestContext.test_mockablec                 C   s   |   ¡ }| ¡  |jsJ ‚d S r   )r    r"   r'   )r   Úcr   r   r   Ú	test_termD   s   zTestContext.test_termc              	   C   sv   t  t¡" |  ¡ }| tj¡}W d   ƒ n1 sw   Y  W d   ƒ n1 s*w   Y  |js4J ‚|js9J ‚d S r   )ÚpytestZwarnsÚResourceWarningr    r*   r+   r,   r'   ©r   r.   Úsr   r   r   Útest_context_managerI   s   
ÿ€ÿ
z TestContext.test_context_managerc                 C   s   |   tj| jd¡ d S )Néÿÿÿÿ)ÚassertRaisesErrnor+   ÚEINVALr    ©r   r   r   r   Útest_fail_initQ   s   zTestContext.test_fail_initc                 C   sN   |   tjtj¡\}}| tjd¡ |jddd | ¡  | ¡  | j 	¡  d S )Nr   s   helloF)Úcopy)
Úcreate_bound_pairr+   ZROUTERÚDEALERÚ
setsockoptÚLINGERÚsendÚcloser:   r"   )r   ÚrepÚreqr   r   r   Útest_term_hangT   s   zTestContext.test_term_hangc                 C   sf   | j  ¡ }| j jdd}||u sJ ‚| ¡  | j  ¡ }| j  ¡ }||us&J ‚|jr+J ‚||u s1J ‚d S )Né   )Z
io_threads)r    Úinstancer"   r'   )r   r.   r$   r%   Zc4r   r   r   Útest_instance\   s   



zTestContext.test_instancec                 C   sd   | j  ¡  G dd„ dtjƒ}| ¡ }tj ¡ }| ¡  | ¡  t|ƒtju s(J ‚t|ƒ|u s0J ‚d S )Nc                   @   ó   e Zd ZdS )z<TestContext.test_instance_subclass_first.<locals>.SubContextN©r   r   r   r   r   r   r   Ú
SubContextj   ó    rX   ©r:   r"   r+   r    rT   Útype)r   rX   Úsctxr.   r   r   r   Útest_instance_subclass_firstg   s   

z(TestContext.test_instance_subclass_firstc                 C   s˜   | j  ¡  G dd„ dtjƒ}G dd„ dtjƒ}tj ¡ }| ¡ }| ¡ }| ¡  | ¡  | ¡  t|ƒtju s9J ‚t|ƒtju sBJ ‚t|ƒ|u sJJ ‚d S )Nc                   @   rV   )zDTestContext.test_instance_subclass_second.<locals>.SubContextInheritNrW   r   r   r   r   ÚSubContextInheritw   rY   r^   c                   @   s   e Zd ZdZdS )zFTestContext.test_instance_subclass_second.<locals>.SubContextNoInheritN)r   r   r   Z	_instancer   r   r   r   ÚSubContextNoInheritz   r   r_   rZ   )r   r^   r_   r.   r\   Zsctx2r   r   r   Útest_instance_subclass_secondt   s   

z)TestContext.test_instance_subclass_secondc                    s®   | j  ¡  tƒ ‰G dd„ d| jƒ‰ ‡ ‡fdd„‰d}‡fdd„t|ƒD ƒ}dd„ |D ƒ ˆ  ¡ }t|ˆ ƒs7J ‚t|ƒD ]}ˆjd	d
}||u sIJ ‚q;| ¡  dd„ |D ƒ d S )Nc                       s   e Zd Z‡ fdd„Z‡  ZS )z9TestContext.test_instance_threadsafe.<locals>.SlowContextc                    s    t  d¡ tƒ j|i |¤Ž d S )Né   )ÚtimeÚsleepr   r   )r   ÚaÚkwr   r   r   r      s   
zBTestContext.test_instance_threadsafe.<locals>.SlowContext.__init__)r   r   r   r   r   r   r   r   r   ÚSlowContextŽ   s    rf   c                      s   ˆ  ˆ  ¡ ¡ d S r   )ÚputrT   r   )rf   Úqr   r   Úf“   s   z/TestContext.test_instance_threadsafe.<locals>.fé   c                    s   g | ]}t ˆ d ‘qS )©Útarget)r   ©Ú.0Úi)ri   r   r   Ú
<listcomp>˜   s    z8TestContext.test_instance_threadsafe.<locals>.<listcomp>c                 S   ó   g | ]}|  ¡ ‘qS r   )Ústart©rn   Útr   r   r   rp   ™   ó    é   ©Útimeoutc                 S   s   g | ]}|j d d‘qS )rv   rw   )Újoinrs   r   r   r   rp   £   ó    )r:   r"   r   r    ÚrangerT   r!   Úget)r   ÚNÚthreadsr.   ro   Z
thread_ctxr   )rf   ri   rh   r   Útest_instance_threadsafe‡   s   
z$TestContext.test_instance_threadsafec              	   C   s~   d}t ƒ 0}|jtj|d}|j|u sJ ‚W d   ƒ n1 s w   Y  W d   ƒ d S W d   ƒ d S 1 s8w   Y  d S )Nztesting one two three)r   )r   r*   r+   rK   r   )r   r   r.   r*   r   r   r   Útest_socket_passes_kwargs¥   s   ÿÿ"ÿz%TestContext.test_socket_passes_kwargsc              	   C   sŽ   G dd„ dt jƒ}|  ¡ 0}|jt j|d}t||ƒsJ ‚W d   ƒ n1 s(w   Y  W d   ƒ d S W d   ƒ d S 1 s@w   Y  d S )Nc                   @   rV   )z7TestContext.test_socket_class_arg.<locals>.CustomSocketNrW   r   r   r   r   ÚCustomSocket¬   rY   r   )Zsocket_class)r+   ÚSocketr    r*   r,   r!   )r   r   r.   rB   r   r   r   Útest_socket_class_arg«   s   
ÿÿ"ÿz!TestContext.test_socket_class_argc                    sP   |   ¡ ‰ tdƒD ]}‡ fdd„tdƒD ƒ}dd„ |D ƒ t d¡ qˆ  ¡  dS )z9opening and closing many sockets shouldn't cause problemsrj   c                    ó   g | ]}ˆ   tj¡‘qS r   ©r*   r+   ÚREPrm   ©r.   r   r   rp   ·   rz   z1TestContext.test_many_sockets.<locals>.<listcomp>éA   c                 S   rq   r   ©rO   ©rn   rB   r   r   r   rp   ¸   ru   ç{®Gáz„?N)r    r{   rb   rc   r"   )r   ro   Úsocketsr   r‡   r   Útest_many_sockets³   s   zTestContext.test_many_socketsc                 C   sx   |   ¡ }d|_|jdksJ ‚| tj¡}|jdksJ ‚| tj¡dks%J ‚| ¡  d|_| tj¡}| ¡  | 	¡  dS )z*setting socket options with ctx attributesrv   ó    N)
r    Úlingerr*   r+   ÚREQÚ
getsockoptrM   rO   Ú	subscriber"   rA   r   r   r   Útest_sockopts½   s   zTestContext.test_sockoptsÚwinzSegfaults on Windowsc                    s`   |   ¡ ‰ ‡ fdd„tdƒD ƒ}dd„ |ddd… D ƒ ˆ  ¡  t d¡ |D ]}|js-J ‚q&dS )z$Context.destroy should close socketsc                    r„   r   r…   rm   r‡   r   r   rp   Ñ   rz   z,TestContext.test_destroy.<locals>.<listcomp>rˆ   c                 S   rq   r   r‰   rŠ   r   r   r   rp   Ô   ru   NrS   r‹   )r    r{   Údestroyrb   rc   r'   )r   rŒ   rB   r   r‡   r   Útest_destroyÍ   s   
ÿzTestContext.test_destroyc                 C   s\   |   tjtj¡\}}| d¡ t d¡ | jjdd t d¡ ||fD ]}|j	s+J ‚q$dS )z4Context.destroy should set linger on closing socketsó   hir‹   r   )r   N)
rJ   r+   r   r†   rN   rb   rc   r:   r•   r'   )r   rQ   rP   rB   r   r   r   Útest_destroy_lingerÜ   s   


ÿzTestContext.test_destroy_lingerc                 C   sv   |   ¡ }| tj¡}|jrJ ‚t|jd}| ¡  |jdd | 	¡ s'J dƒ‚| 
¡  |jdd | 	¡ r9J dƒ‚dS )z Context.term won't close socketsrk   gš™™™™™¹?rw   zContext should be waitingzContext should have closedN)r    r*   r+   r   r'   r   r"   rr   ry   Úis_aliverO   )r   r.   rB   rt   r   r   r   Útest_term_nocloseç   s   
zTestContext.test_term_noclosec                    sJ   t rtdƒ‚‡ fdd„}t|d}| ¡  |jdd | ¡ r#J dƒ‚dS )	z+test close&term by garbage collection alonezGC doesn't work c                     s   ‡ fdd„} | ƒ  t  ¡  d S )Nc                     s   ˆ   ¡ } |  tj¡ d S r   )r    r*   r+   r,   r‡   rG   r   r   Úinnerû   s   z/TestContext.test_gc.<locals>.gcf.<locals>.inner)ÚgcZcollect)r›   rG   r   r   Úgcfú   s   z TestContext.test_gc.<locals>.gcfrk   ra   rw   z1Garbage collection should have cleaned up contextN)r   r
   r   rr   ry   r™   )r   r   rt   r   rG   r   Útest_gcô   s   
	zTestContext.test_gcc                    s*   G ‡ fdd„dƒ‰ ‡ ‡fdd„}|ƒ  dS )z6ctx.destroy should succeed when cyclic ref prevents gcc                       s"   e Zd Zddd„Z‡ fdd„ZdS )z8TestContext.test_cyclic_destroy.<locals>.CyclicReferenceNc                 S   s
   || _ d S r   )Úparent)r   rŸ   r   r   r   r     s   
zATestContext.test_cyclic_destroy.<locals>.CyclicReference.__init__c                    s   || _ ˆ | ƒ| _d S r   )ÚsockÚchild)r   r    ©ÚCyclicReferencer   r   Úcrash  s   z>TestContext.test_cyclic_destroy.<locals>.CyclicReference.crashr   )r   r   r   r   r¤   r   r¢   r   r   r£     s    
r£   c                     s0   ˆ  ¡ } |  tj¡}ˆ ƒ }| |¡ |  ¡  d S r   )r    r*   r+   r-   r¤   r•   )r.   r    r=   ©r£   r   r   r   Ú	crash_zmq  s
   
z2TestContext.test_cyclic_destroy.<locals>.crash_zmqNr   )r   r¦   r   r¥   r   Útest_cyclic_destroy  s   
zTestContext.test_cyclic_destroyc                    s„   ˆ  ¡ ‰ tƒ ‰ˆ ¡  ‡ ‡‡fdd„}t|d}| ¡  ˆ d¡ ˆ ¡ s)J dƒ‚t d¡ ˆ  	¡  |j
dd | ¡ r@J dƒ‚d	S )
z/ctx.term should not crash active threads (#139)c               
      s”   ˆ   tj¡} |  d¡ ˆ ¡  z.z|  ¡  W n! tjy7 } z|jtjks'J ‚W Y d }~W |  	¡  d S d }~ww W |  	¡  n|  	¡  w ˆ 
d¡ d S )Nútcp://127.0.0.1z,recv should have been interrupted with ETERM)r*   r+   r†   Úbind_to_random_portÚsetÚrecvZZMQErrorÚerrnoZETERMrO   Zfail)rB   Úe©r.   Zevtr   r   r   Úblock#  s   
€üÿz+TestContext.test_term_thread.<locals>.blockrk   ra   zsync event never firedr‹   rw   z%term should have interrupted s.recv()N)r    r   Úclearr   rr   ÚwaitÚis_setrb   rc   r"   ry   r™   )r   r¯   rt   r   r®   r   Útest_term_thread  s   


zTestContext.test_term_threadc                 C   sF   |   ¡ }| tj¡}| d¡ | ¡  | ¡  |jsJ ‚|js!J ‚d S )Nr¨   )r    r*   r+   ÚPUBr©   rO   r•   r'   rA   r   r   r   Útest_destroy_no_sockets:  s   

z#TestContext.test_destroy_no_socketsc                 C   sj   t  ¡ dk r
tdƒ‚|  ¡ }| t jd¡ | t j¡dksJ ‚d|_|jdks)J ‚| t j¡dks3J ‚d S )Nr2   z context options require libzmq 3rS   éd   )r+   r5   r
   r    rª   ZMAX_SOCKETSr|   Zmax_socketsr6   r   r   r   Útest_ctx_optsC  s   zTestContext.test_ctx_optsc                 C   sŠ   |   ¡ }t |¡}t |¡}t |¡}|jsJ ‚|jsJ ‚|j|jks%J ‚|j|jks-J ‚|j|jks5J ‚| tj¡}| ¡  | 	¡  d S r   )
r    rI   ÚdeepcopyZ_shadowÚ
underlyingr*   r+   r´   rO   r"   )r   r#   r$   Zc2br%   rB   r   r   r   Ú	test_copyM  s   




zTestContext.test_copyc                 C   sî   |   ¡ }| j  |j¡}|j|jksJ ‚| tj¡}| ¡  ~|jr#J ‚| tj¡}| j  |¡}| tj¡}W d   ƒ n1 s@w   Y  |jsJJ ‚|jrOJ ‚| ¡  |   |¡}|j|jks`J ‚~|jrfJ ‚| ¡  |  	tj
|jtj¡ ~d S r   )r    Zshadowr¹   r*   r+   r´   rO   r'   r"   rE   ZEFAULT)r   r.   Úctx2rB   Ús2Zctx3r   r   r   Útest_shadow[  s,   
ÿ



zTestContext.test_shadowc           	      C   s¢   zddl m}m}m} W n ty   tdƒ‚w | ¡ }| |tj¡}| 	|d¡ | j
 |¡}| tj¡}| d¡ | |d¡ |  |¡}|dksKJ ‚| ¡  d S )Nr   )ÚzctxÚzsocketÚzstrzRequires pyczmqz
inproc://ar—   )Zpyczmqr¾   r¿   rÀ   Ú	Exceptionr
   Únewr+   r,   Úbindr    Zshadow_pyczmqr*   r-   ÚconnectrN   r«   rO   )	r   r¾   r¿   rÀ   r.   rd   r»   ÚbZrcvdr   r   r   Útest_shadow_pyczmqu  s   ÿ

zTestContext.test_shadow_pyczmqzNo fork on Windowsc           
      C   sÌ   | j  ¡ }t|ƒ}t ¡ \}}t |d¡}t ¡ }|dkrG| j  ¡ }t |d¡}t|ƒ}| ¡  | t	|ƒd ¡ | 
¡  | ¡  t d¡ nt |¡ | ¡ }	| ¡  |	sXJ ‚t|	ƒ|ks`J ‚| ¡  d S )NÚrr   ÚwÚ
)r    rT   ÚidÚosÚpipeÚfdopenÚforkr"   ÚwriteÚstrÚflushrO   Ú_exitÚreadlineÚint)
r   r.   Zparent_ctx_idZr_fdZw_fdÚreaderZ	child_pidÚwriterZchild_ctx_idZ
child_id_sr   r   r   Útest_fork_instance†  s(   


zTestContext.test_fork_instance)&r   r   r   r&   r(   r1   r7   r   Zskipifr   r<   r>   rC   rH   rR   rU   r]   r`   r   r€   rƒ   r   r“   ÚsysÚplatformÚ
startswithr–   r˜   rš   rž   r§   r³   rµ   r·   rº   r½   rÆ   r×   r   r   r   r   r       sB    


	
r   )rI   rœ   rË   rØ   rb   Úqueuer   Ú	threadingr   r   Zunittestr   r?   r   r+   Z	zmq.testsr   r   r	   r
   r‚   r   r    r   r   ZTestContextGreenr   r   r   r   Ú<module>   s&      