U
    luf'  ã                   @   s‚  d 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	Z	ddl	m
Z
 ddlZddlmZ e	jdd„ ƒZdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Ze
jeedƒ dddd„ ƒZe
jeedƒ 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/d0„ Z#e	j
jej$ %d1¡d2dd3d4„ ƒZ&d5d6„ Z'd7d8„ Z(d9d:„ Z)G d;d<„ d<eƒZ*d=d>„ Z+dS )?zTest asyncio supporté    N)ÚCancelledError)ÚProcess)Úmarkc                 C   s   t jS ©N)ÚzaioÚContext)Z
event_loop© r   ú:/tmp/pip-unpacked-wheel-h6ekxre8/zmq/tests/test_asyncio.pyr      s    r   c              	   C   s,   |   tj¡}t|tjƒst‚W 5 Q R X d S r   )ÚsocketÚzmqÚPUSHÚ
isinstancer   ÚSocketÚAssertionError)ÚcontextÚsr   r   r	   Útest_socket_class   s    r   c                 C   sP   t jj ¡ }t j ¡ }| ¡  | ¡  t|ƒt jks8t‚t|ƒt jjksLt‚d S r   )r   Úasyncior   ÚinstanceZtermÚtyper   )r   ÚactxÚctxr   r   r	   Útest_instance_subclass_first   s    
r   c              
   C   sX   t j ¡ D}t|ƒt jkst‚t jj ¡ }t|ƒt jjks@t‚W 5 Q R X W 5 Q R X d S r   )r   r   r   r   r   r   )r   r   r   r   r   r	   Útest_instance_subclass_second&   s    r   c                 Ã   sR   |t jt jƒ\}}| ¡ }| ¡ r&t‚| d¡I d H  |I d H }|dgksNt‚d S )Nó   hi)r   r   ÚPULLÚrecv_multipartÚdoner   Úsend)r   Úcreate_bound_pairÚaÚbÚfÚrecvdr   r   r	   Útest_recv_multipart-   s    
r$   c                 Ã   s„   | t jt jƒ\}}| ¡ }| ¡ }| ¡ r.t‚| ¡ r:t‚| ddg¡I d H  |I d H }| ¡ sdt‚| ¡ dkstt‚|dks€t‚d S ©Nr   ó   there)r   r   r   Úrecvr   r   Úsend_multipartÚresult)r   r    r!   Úf1Úf2r#   r   r   r	   Ú	test_recv6   s    
r,   ZRCVTIMEOzrequires RCVTIMEO)Úreasonc              	   Ã   s„   | \}}d|_ | ¡ }d|_ | ¡ }t tj¡ |I d H  W 5 Q R X | ddg¡I d H  |I d H }| ¡ spt	‚|ddgks€t	‚d S )Néd   éè  r   r&   )
Zrcvtimeor'   r   ÚpytestÚraisesr   ÚAgainr(   r   r   ©Ú	push_pullr    r!   r*   r+   r#   r   r   r	   Útest_recv_timeoutC   s    
r5   ZSNDTIMEOzrequires SNDTIMEOc              	   Ã   s<   | t jƒ}d|_t t j¡ | d¡I d H  W 5 Q R X d S )Nr.   s   not going anywhere)r   r   Zsndtimeor0   r1   r2   r   )r
   r   r   r   r	   Útest_send_timeoutR   s    
r6   c                 Ã   sf   | \}}|  ¡ }| ¡ rt‚d}| |¡I d H  |I d H }| ¡ sFt‚| ¡ |ksVt‚||ksbt‚d S )Nu   Ï€Ã¸Ã¸Ï€)Zrecv_stringr   r   Zsend_stringr)   )r4   r    r!   r"   Úmsgr#   r   r   r	   Útest_recv_stringZ   s    
r8   c                 Ã   sl   | \}}|  ¡ }| ¡ rt‚tdd}| |¡I d H  |I d H }| ¡ sLt‚| ¡ |ks\t‚||ksht‚d S ©Né   ©r    )Ú	recv_jsonr   r   ÚdictÚ	send_jsonr)   ©r4   r    r!   r"   Úobjr#   r   r   r	   Útest_recv_jsonf   s    

rA   c              	   Ã   s   | \}}|  ¡ }| ¡ rt‚| ¡  t d¡I d H  tdd}| |¡I d H  tj	dk rzt
 t¡ |I d H }W 5 Q R X n$t
 tjj¡ |I d H }W 5 Q R X | ¡ sªt‚|jddI d H }|sÄt‚t d¡I d H  |  ¡ }tj|ddI d H }||ksüt‚d S )Nr   r:   r;   )é   é   ©Útimeout)r<   r   r   Úcancelr   Úsleepr=   r>   ÚsysÚversion_infor0   r1   r   Ú
exceptionsÚpollÚwait_for)r4   r    r!   r"   r@   r#   Úeventsr   r   r	   Útest_recv_json_cancelledr   s&    

rN   c                 Ã   sl   | \}}|  ¡ }| ¡ rt‚tdd}| |¡I d H  |I d H }| ¡ sLt‚| ¡ |ks\t‚||ksht‚d S r9   )Z
recv_pyobjr   r   r=   Z
send_pyobjr)   r?   r   r   r	   Útest_recv_pyobj   s    

rO   c                 Ã   s¸   dd„ }dd„ }| t jt jƒ\}}ddddœi}| ||¡I d H  | |¡I d H }|d |d ksft‚|d	 srt‚| ||¡I d H  | |¡I d H }|d |d ks¨t‚|d	 r´t‚d S )
Nc                 S   s8   g }|  |  dg ¡¡ t | d ¡ d¡}| |¡ |S )NÚ
identitiesÚcontentÚutf8)ÚextendÚgetÚjsonÚdumpsÚencodeÚappend)r7   ÚframesrQ   r   r   r	   Ú	serializeš   s
    
z(test_custom_serialize.<locals>.serializec                 S   s*   | d d… }t  | d  d¡¡}||dœS )NéÿÿÿÿrR   )rP   rQ   )rU   ÚloadsÚdecode)rY   rP   rQ   r   r   r	   Údeserialize¡   s
    þz*test_custom_serialize.<locals>.deserializerQ   r:   Úbee©r    r!   rP   )r   ZDEALERZROUTERÚsend_serializedÚrecv_serializedr   )r   rZ   r^   r    r!   r7   r#   Zr2r   r   r	   Útest_custom_serialize™   s     þÿrc   c              	   Ã   s|   | \}}ddddœi}t  t¡ | ttj¡I d H  W 5 Q R X | d¡I d H  t  t¡ | tj¡I d H  W 5 Q R X d S )NrQ   r:   r_   r`   s   not json)	r0   r1   Ú	TypeErrorra   rU   rV   r   rb   r\   )Zdealer_routerr    r!   r7   r   r   r	   Útest_custom_serialize_error¼   s    þÿre   c              	   Ã   s†   | \}}|  tj¡}t tj¡ |I d H  W 5 Q R X | d¡I d H  | ¡ I d H  |  tj¡}| ¡ slt	‚|I d H }|dks‚t	‚d S )Ns   ping)
r'   r   ZDONTWAITr0   r1   r2   r   rK   r   r   )r4   ÚpushÚpullr"   r7   r   r   r	   Útest_recv_dontwaitÍ   s    
rh   c                 Ã   s†   | \}}|  ¡ }| ¡ }| ¡ s$t‚| ¡ s0t‚| ¡ r<t‚| ddg¡I d H  |I d H }| ¡ sft‚| ¡ srt‚|ddgks‚t‚d S r%   )r'   r   rF   r   r   r(   Ú	cancelledr3   r   r   r	   Útest_recv_cancelÚ   s    
rj   c                 Ã   sÈ   | \}}|j dd}t d¡I d H  | ¡ dks4t‚|j dd}| ¡ rLt‚|I d H }|dksbt‚|j dd}| ¡ rzt‚| ddg¡I d H  |I d H }|tjks¦t‚| 	¡ I d H }|ddgksÄt‚d S )Nr   rD   é   r/   r   r&   )
rK   r   rG   r)   r   r   r(   r   ÚPOLLINr   )r4   r    r!   r"   Úevtr#   r   r   r	   Ú	test_pollè   s    

rn   c           	      Ã   s¼   t  ¡ }d}| t j¡}| t j¡}|  ||g¡ | |¡ | |¡ t 	¡ }| 
|t j¡ |jdd}| ¡ rtt‚| ddg¡ |I d H }||t jfgks t‚| ¡ }|ddgks¸t‚d S )Nzinproc://testr/   rD   r   r&   )r   r   r
   r   r   rS   ÚbindÚconnectr   ÚPollerÚregisterrl   rK   r   r   r(   r   )	Zsocketsr   Úurlr    r!   Zpollerr"   rm   r#   r   r   r	   Útest_poll_base_socketý   s     


rt   c                 Ã   sV   | \}}|j dd}| ¡  tdƒD ] }t d¡I d H  | ¡ r$ qFq$| ¡ sRt‚d S )Nrk   rD   r:   r   )rK   ÚcloseÚranger   rG   ri   r   )r4   r    r!   r"   Ú_r   r   r	   Útest_poll_on_closed_socket  s    rx   Úwinz)Windows does not support polling on filesc                  Ã   s  t  ¡ } t ¡ \}}t |d¡}t |d¡}|  |tj¡ |  |tj¡ | j	ddI d H }t
|ƒ}| ¡ |ksrt‚| ¡ |ks‚t‚|| ¡  tjks˜t‚|  |¡ | d¡ | ¡  | j	ddI d H }t
|ƒ}| ¡ |ksÞt‚|| ¡  tjksôt‚| d¡dkst‚| ¡  | ¡  d S )NÚrbÚwbrk   rD   ó   xr/   )r   rq   ÚosÚpipeÚfdopenrr   r   rl   ÚPOLLOUTrK   r=   Úfilenor   Ú
unregisterÚwriteÚflushÚreadru   )ÚpÚrÚwZevtsr   r   r	   Útest_poll_raw!  s*    

r‰   c                    sN   | \‰ ‰‡ ‡fdd„}t dƒD ]*}t ¡ }| tj|ƒ dd¡ | ¡  qd S )Nc                  “   s.   ˆ   d¡I d H  ˆ ¡ I d H } | dks*t‚d S )Ns   buf)r   r'   r   )r7   r`   r   r	   ÚtestE  s    z!test_multiple_loops.<locals>.testrB   é
   rD   )rv   r   Únew_event_loopÚrun_until_completerL   ru   )r4   rŠ   ÚiÚloopr   r`   r	   Útest_multiple_loopsB  s    r   c               	   C   s^   t  ¡ L} |  t j¡}t |¡}t|tjƒs0t‚|j|jks@t‚|j	|j	ksPt‚W 5 Q R X d S r   )
r   r   r
   r   r   r   r   r   Z
underlyingr   )r   r   Zasync_sr   r   r	   Útest_shadowP  s    

r‘   c               
   Ã   s¨   t j ¡ } |  |  t j¡x}t|jƒdks0t‚tdƒD ]4}t 	|j
dt jjd¡}| ¡  t d¡I d H  q8t d¡I d H  t|jƒdkst‚W 5 Q R X W 5 Q R X d S )Nr   r‹   r/   )rE   Úflagsgš™™™™™¹?)r   r   r   r
   r   ÚlenZ_recv_futuresr   rv   Zensure_futurerK   Z	PollEventrl   rF   rG   )r   r   rŽ   r"   r   r   r	   Útest_poll_leakY  s    
r”   c                   @   s   e Zd Zdd„ ZdS )ÚProcessForTeardownTestc                 C   sˆ   t j ¡ }| tj¡}| d¡ dd„ }t ¡ }tj	||ƒdd}z6z| |¡ W n tjk
rh   Y nX dsvtdƒ‚W 5 | 
¡  X dS )	z;Leave context, socket and event loop upon implicit disposalztcp://127.0.0.1c                 Ó   s   |   ¡ I d H  d S r   )r'   )r
   r   r   r	   Únever_ending_taskn  s    z5ProcessForTeardownTest.run.<locals>.never_ending_taskrk   rD   Fz,never_ending_task was completed unexpectedlyN)r   r   r   r
   r   ZPAIRZbind_to_random_portr   rŒ   rL   ru   r   ÚTimeoutErrorr   )Úselfr   r
   r–   r   Úcoror   r   r	   Úrung  s    

zProcessForTeardownTest.runN)Ú__name__Ú
__module__Ú__qualname__rš   r   r   r   r	   r•   f  s   r•   c                 C   sT   t ƒ }| ¡  |  |j¡ | d¡ |jd k	s6tdƒ‚|jdksPtd|j› ƒ‚d S )Nr‹   zprocess teardown hangsr   zPython process died with code )r•   ÚstartZaddfinalizerÚ	terminateÚjoinÚexitcoder   )ÚrequestÚprocr   r   r	   Útest_process_teardown}  s    
r¤   ),Ú__doc__r   rU   r}   rH   Úconcurrent.futuresr   Úmultiprocessingr   r0   r   r   Zzmq.asyncior   Zfixturer   r   r   r   r$   r,   ZskipifÚhasattrr5   r6   r8   rA   rN   rO   rc   re   rh   rj   rn   rt   rx   ÚplatformÚ
startswithr‰   r   r‘   r”   r•   r¤   r   r   r   r	   Ú<module>   sT   
		

#
þ
	