U
    luf81  ã                   @   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||Ž d S )NÚ
test_kwarg)ÚpopÚtest_kwarg_valueÚsuperÚ__init__)ÚselfÚargsÚkwargs©Ú	__class__© ú:/tmp/pip-unpacked-wheel-h6ekxre8/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      s   r   c                   @   s.  e Zd Zdd„ ZdZdd„ Zdd„ Zeje	dk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t‚| ¡  |   ¡ }t|| j ƒs8t‚| ¡  |   ¡ }t|| j ƒsXt‚| ¡  d S ©N)ÚContextÚ
isinstanceÚAssertionErrorÚterm)r   Úc1Úc2Úc3r   r   r   Ú	test_init!   s    zTestContext.test_initzzmq.Contextc                 C   sÈ   |   ¡ Ž}| j› dt|ƒks"t‚dt|ƒks2t‚| tj¡N}| j› dt|ƒksXt‚| tj¡}| j› dt|ƒks~t‚W 5 Q R X W 5 Q R X W 5 Q R X | j› dt|ƒks´t‚dt|ƒksÄt‚d S )Nz()Úclosedz
(1 socket)z(2 sockets))r   Ú	_repr_clsÚreprr!   ÚsocketÚzmqÚPUSHÚPULL)r   ÚctxÚpushÚpullr   r   r   Ú	test_repr.   s    
6zTestContext.test_reprc                 C   s@   |   ¡ }dt|ƒkst‚t ¡ dkr4dt|ƒks4t‚| ¡  d S )Nr*   ©é   Z
IO_THREADS)r   Údirr!   r+   Ú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t‚d S r   )r   r"   r'   r!   )r   Úcr   r   r   Ú	test_termD   s    zTestContext.test_termc              
   C   sN   t  t¡& |  ¡ }| tj¡}W 5 Q R X W 5 Q R X |js@t‚|jsJt‚d S r   )	ÚpytestZwarnsÚResourceWarningr   r*   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}||ks$t‚| ¡  | j  ¡ }| j  ¡ }||k	sLt‚|jrVt‚||ksbt‚d S )Né   )Z
io_threads)r   Úinstancer!   r"   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ksPt‚t|ƒ|ks`t‚d S )Nc                   @   s   e Zd ZdS )z<TestContext.test_instance_subclass_first.<locals>.SubContextN©r   r   r   r   r   r   r   Ú
SubContextj   s   rW   ©r:   r"   r+   r   rT   Útyper!   )r   rW   Ú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ksrt‚t|ƒtjks„t‚t|ƒ|ks”t‚d S )Nc                   @   s   e Zd ZdS )zDTestContext.test_instance_subclass_second.<locals>.SubContextInheritNrV   r   r   r   r   ÚSubContextInheritw   s   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   s   r]   rX   )r   r\   r]   r.   rZ   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|ˆ ƒsnt‚t|ƒD ]}ˆjd	d
}||ksvt‚qv| ¡  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||Ž 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   rd   c                      s   ˆ  ˆ  ¡ ¡ d S r   )ÚputrT   r   )rd   Úqr   r   Úf“   s    z/TestContext.test_instance_threadsafe.<locals>.fé   c                    s   g | ]}t ˆ d ‘qS )©Útarget)r   ©Ú.0Úi)rg   r   r   Ú
<listcomp>˜   s     z8TestContext.test_instance_threadsafe.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r   )Ústart©rl   Útr   r   r   rn   ™   s     é   ©Útimeoutc                 S   s   g | ]}|j d d‘qS )rr   rs   )Újoinrp   r   r   r   rn   £   s     )	r:   r"   r   r   ÚrangerT   r    r!   Úget)r   ÚNÚthreadsr.   rm   Z
thread_ctxr   )rd   rg   rf   r   Útest_instance_threadsafe‡   s    
z$TestContext.test_instance_threadsafec              
   C   sD   d}t ƒ 0}|jtj|d}|j|ks,t‚W 5 Q R X W 5 Q R X d S )Nztesting one two three)r   )r   r*   r+   rK   r   r!   )r   r   r.   r*   r   r   r   Útest_socket_passes_kwargs¥   s    z%TestContext.test_socket_passes_kwargsc              
   C   sT   G dd„ dt jƒ}|  ¡ 0}|jt j|d}t||ƒs<t‚W 5 Q R X W 5 Q R X d S )Nc                   @   s   e Zd ZdS )z7TestContext.test_socket_class_arg.<locals>.CustomSocketNrV   r   r   r   r   ÚCustomSocket¬   s   r|   )Zsocket_class)r+   ÚSocketr   r*   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 ]2}‡ fdd„tdƒD ƒ}dd„ |D ƒ t d¡ qˆ  ¡  dS )z9opening and closing many sockets shouldn't cause problemsrh   c                    s   g | ]}ˆ   tj¡‘qS r   ©r*   r+   ÚREPrk   ©r.   r   r   rn   ·   s     z1TestContext.test_many_sockets.<locals>.<listcomp>éA   c                 S   s   g | ]}|  ¡ ‘qS r   ©rO   ©rl   rB   r   r   r   rn   ¸   s     ç{®Gáz„?N)r   rv   r`   ra   r"   )r   rm   Úsocketsr   r   r   Útest_many_sockets³   s    zTestContext.test_many_socketsc                 C   sx   |   ¡ }d|_|jdkst‚| tj¡}|jdks6t‚| tj¡dksJt‚| ¡  d|_	| tj¡}| ¡  | 
¡  dS )z*setting socket options with ctx attributesrr   ó    N)r   Úlingerr!   r*   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sLt‚qLdS )z$Context.destroy should close socketsc                    s   g | ]}ˆ   tj¡‘qS r   r   rk   r   r   r   rn   Ñ   s     z,TestContext.test_destroy.<locals>.<listcomp>r‚   c                 S   s   g | ]}|  ¡ ‘qS r   rƒ   r„   r   r   r   rn   Ô   s     NrS   r…   )r   rv   Údestroyr`   ra   r'   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	sHt
‚qHdS )z4Context.destroy should set linger on closing socketsó   hir…   r   )r‰   N)rJ   r+   rŠ   r€   rN   r`   ra   r:   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t‚t|jd}| ¡  |j	dd | 
¡ sNtdƒ‚| ¡  |j	dd | 
¡ rrtdƒ‚dS )z Context.term won't close socketsri   gš™™™™™¹?rs   zContext should be waitingzContext should have closedN)r   r*   r+   rŠ   r'   r!   r   r"   ro   ru   Úis_aliverO   )r   r.   rB   rq   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 | ¡ rFt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>.gcfri   r_   rs   z1Garbage collection should have cleaned up contextN)r   r
   r   ro   ru   r“   r!   )r   r—   rq   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.crash)N)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¡ ˆ ¡ sRtdƒ‚t 	d¡ ˆ  
¡  |jdd | ¡ r€tdƒ‚d	S )
z/ctx.term should not crash active threads (#139)c               
      sˆ   ˆ   tj¡} |  d¡ ˆ ¡  zPz|  ¡  W n> tjk
rj } z|jtj	ksPt
‚W Y ¢W ¢d S d }~X Y nX W 5 |  ¡  X ˆ d¡ d S )Nútcp://127.0.0.1z,recv should have been interrupted with ETERM)r*   r+   r€   Úbind_to_random_portÚsetrO   ÚrecvZZMQErrorÚerrnoZETERMr!   Zfail)rB   Úe©r.   Zevtr   r   r   Úblock#  s    
 
z+TestContext.test_term_thread.<locals>.blockri   r_   zsync event never firedr…   rs   z%term should have interrupted s.recv()N)r   r   Úclearr   ro   ÚwaitÚis_setr!   r`   ra   r"   ru   r“   )r   r©   rq   r   r¨   r   Útest_term_thread  s    


zTestContext.test_term_threadc                 C   sF   |   ¡ }| tj¡}| d¡ | ¡  | ¡  |js8t‚|jsBt‚d S )Nr¢   )	r   r*   r+   ÚPUBr£   rO   r   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>t‚d|_|jdksRt‚| t j¡dksft‚d S )Nr2   z context options require libzmq 3rS   éd   )	r+   r5   r
   r   r¤   ZMAX_SOCKETSrw   r!   Zmax_socketsr6   r   r   r   Útest_ctx_optsC  s    zTestContext.test_ctx_optsc                 C   sŠ   |   ¡ }t |¡}t |¡}t |¡}|js0t‚|js:t‚|j|jksJt‚|j|jksZt‚|j|jksjt‚| tj¡}| 	¡  | 
¡  d S r   )r   rI   ÚdeepcopyZ_shadowr!   Ú
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&t‚| tj¡}| ¡  ~|jrFt‚| tj¡}| j  |¡}| tj¡}W 5 Q R X |js€t‚|jrŠt‚| ¡  |   |¡}|j|jks¬t‚~|jr¸t‚| 	¡  |  
tj|jtj¡ ~d S r   )r   Zshadowr³   r!   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k
r4   tdƒ‚Y nX | ¡ }| |tj¡}| 	|d¡ | j
 |¡}| tj¡}| d¡ | |d¡ |  |¡}|dksœt‚| ¡  d S )Nr   )ÚzctxÚzsocketÚzstrzRequires pyczmqz
inproc://ar‘   )Zpyczmqr¸   r¹   rº   Ú	Exceptionr
   Únewr+   r,   Úbindr   Zshadow_pyczmqr*   r-   ÚconnectrN   r¥   r!   rO   )	r   r¸   r¹   rº   r.   rb   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rŽ| j  ¡ }t |d¡}t|ƒ}| ¡  | t	|ƒd ¡ | 
¡  | ¡  t d¡ n
t |¡ | ¡ }	| ¡  |	s°t‚t|	ƒ|ksÀt‚| ¡  d S )NÚrr   ÚwÚ
)r   rT   ÚidÚosÚpipeÚfdopenÚforkr"   ÚwriteÚstrÚflushrO   Ú_exitÚreadliner!   Ú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^   rz   r{   r~   r‡   r   ÚsysÚplatformÚ
startswithr   r’   r”   r˜   r¡   r­   r¯   r±   r´   r·   rÀ   rÑ   r   r   r   r   r       s@   


	
r   )rI   r–   rÅ   rÒ   r`   Ú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$      