o
    ¹i81  ã                   @   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__© úQ/var/www/edux/Edux_v2/venv/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   Ú_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+   ©é   Ú
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   Ú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    )ÚpytestÚ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,   Ú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é   )Ú
io_threads)r!   Úinstancer#   r(   )r   r/   r%   r&   Ú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   ó    r_   ©r=   r#   r,   r!   rZ   Útype)r   r_   Ú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                   @   r]   )zDTestContext.test_instance_subclass_second.<locals>.SubContextInheritNr^   r   r   r   r   ÚSubContextInheritw   r`   re   c                   @   s   e Zd ZdZdS )zFTestContext.test_instance_subclass_second.<locals>.SubContextNoInheritN)r   r   r   Ú	_instancer   r   r   r   ÚSubContextNoInheritz   r   rg   ra   )r   re   rg   r/   rc   Ú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    ro   c                      s   ˆ  ˆ  ¡ ¡ d S r    )ÚputrZ   r   )ro   Úqr   r   Úf“   s   z/TestContext.test_instance_threadsafe.<locals>.fé   c                    s   g | ]}t ˆ d ‘qS )©Útarget)r   ©Ú.0Úi)rr   r   r   Ú
<listcomp>˜   s    z8TestContext.test_instance_threadsafe.<locals>.<listcomp>c                 S   ó   g | ]}|  ¡ ‘qS r   )Ústart©rw   Útr   r   r   ry   ™   ó    é   ©Útimeoutc                 S   s   g | ]}|j d d‘qS )r   r€   )Újoinr|   r   r   r   ry   £   ó    )r=   r#   r   r!   ÚrangerZ   r"   Úget)r   ÚNÚthreadsr/   rx   Ú
thread_ctxr   )ro   rr   rq   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,   rP   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                   @   r]   )z7TestContext.test_socket_class_arg.<locals>.CustomSocketNr^   r   r   r   r   ÚCustomSocket¬   r`   r‹   )Úsocket_class)r,   ÚSocketr!   r+   r-   r"   )r   r‹   r/   rF   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 problemsrs   c                    ó   g | ]}ˆ   tj¡‘qS r   ©r+   r,   ÚREPrv   ©r/   r   r   ry   ·   rƒ   z1TestContext.test_many_sockets.<locals>.<listcomp>éA   c                 S   rz   r   ©rT   ©rw   rF   r   r   r   ry   ¸   r~   ç{®Gáz„?N)r!   r„   rk   rl   r#   )r   rx   Ú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 attributesr   ó    N)
r!   Úlingerr+   r,   ÚREQÚ
getsockoptrR   rT   Ú	subscriber#   rE   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   rv   r’   r   r   ry   Ñ   rƒ   z,TestContext.test_destroy.<locals>.<listcomp>r“   c                 S   rz   r   r”   r•   r   r   r   ry   Ô   r~   NrX   r–   )r!   r„   Údestroyrk   rl   r(   )r   r—   rF   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)
rN   r,   r›   r‘   rS   rk   rl   r=   r    r(   )r   rV   rU   rF   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 socketsrt   gš™™™™™¹?r€   zContext should be waitingzContext should have closedN)r!   r+   r,   r›   r(   r   r#   r{   r‚   Úis_aliverT   )r   r/   rF   r}   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’   rK   r   r   Úinnerû   s   z/TestContext.test_gc.<locals>.gcf.<locals>.inner)ÚgcÚcollect)r¦   rK   r   r   Úgcfú   s   z TestContext.test_gc.<locals>.gcfrt   rj   r€   z1Garbage collection should have cleaned up contextN)r   r
   r   r{   r‚   r¤   )r   r©   r}   r   rK   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ÚrecvÚZMQErrorÚerrnoÚETERMrT   Úfail)rF   Úe©r/   Úevtr   r   r   Úblock#  s   
€üÿz+TestContext.test_term_thread.<locals>.blockrt   rj   zsync event never firedr–   r€   z%term should have interrupted s.recv()N)r!   r   Úclearr   r{   ÚwaitÚis_setrk   rl   r#   r‚   r¤   )r   r¿   r}   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µ   rT   r    r(   rE   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 )Nr3   z context options require libzmq 3rX   éd   )r,   r7   r
   r!   r¶   ÚMAX_SOCKETSr…   Úmax_socketsr8   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!   rM   ÚdeepcopyÚ_shadowÚ
underlyingr+   r,   rÄ   rT   r#   )r   r$   r%   Úc2br&   rF   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!   ÚshadowrÌ   r+   r,   rÄ   rT   r(   r#   rI   ÚEFAULT)r   r/   Úctx2rF   Ús2Ú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¢   )ÚpyczmqrÕ   rÖ   r×   Ú	Exceptionr
   Únewr,   r-   Úbindr!   Úshadow_pyczmqr+   r.   ÚconnectrS   r·   rT   )	r   rÕ   rÖ   r×   r/   rm   rÑ   ÚbÚ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!   rZ   ÚidÚosÚpipeÚfdopenÚforkr#   ÚwriteÚstrÚflushrT   Ú_exitÚreadlineÚint)
r   r/   Úparent_ctx_idÚr_fdÚw_fdÚreaderÚ	child_pidÚwriterÚchild_ctx_idÚ
child_id_sr   r   r   Útest_fork_instance†  s(   


zTestContext.test_fork_instance)&r   r   r   r'   r)   r2   r9   r   Úskipifr   r?   rA   rG   rL   rW   r\   rd   ri   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   )rM   r§   rå   rù   rk   Úqueuer   Ú	threadingr   r   Úunittestr   rB   r   r,   Ú	zmq.testsr   r   r	   r
   r   r   r!   r   r   ÚTestContextGreenr   r   r   r   Ú<module>   s&      