B
    ÐH/\p9  ã               @   s
  d dl mZ e ¡  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	Z	d dl
mZ d dlmZ d dl
mZ d dl
mZ d dlmZ eZdd„ ZG d	d
„ d
eƒZG dd„ dejƒZdd„ ZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZedkre ¡  dS )é    )ÚmonkeyN)Úwraps)Úsix)ÚLARGE_TIMEOUT)ÚThreadc                s   t ˆ ƒ‡ fdd„ƒ}|S )Nc                 s.   y
ˆ | |ŽS    t  ¡  t d¡ Y nX d S )Né   )Ú	tracebackÚ	print_excÚosÚ_exit)ÚargsÚkwargs)Úfunc© ú8lib/python3.7/site-packages/gevent/tests/test__socket.pyÚwrapper   s
    
zwrap_error.<locals>.wrapper)r   )r   r   r   )r   r   Ú
wrap_error   s    r   c               @   s   e Zd Zdd„ ZdS )r   c             K   s4   |  d¡}t|ƒ}tj| fd|i|—Ž |  ¡  d S )NÚtarget)Úpopr   Ú_ThreadÚ__init__Ústart)Úselfr   r   r   r   r   r   #   s    
zThread.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   !   s   r   c                   s$  e Zd ZdZejZd dd„ edƒD ƒ¡Z	e
e	eƒs>e	 d¡Z	‡ fdd„Zd	d
„ Zd9dd„Zd:dd„Zdd„ Zejs|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#Zd$d% Ze d&¡d'd(„ ƒZ d)d*„ Z!d+d,„ Z"d-d.„ Z#d/d0„ Z$d1d2„ Z%d3d4„ Z&e' (e)ed5ƒd6¡d7d8„ ƒZ*‡  Z+S );ÚTestTCPNz, c             C   s   g | ]}t |ƒ‘qS r   )Ústr)Ú.0Úxr   r   r   ú
<listcomp>.   s    zTestTCP.<listcomp>i N  Úasciic                s2   t t| ƒ ¡  |  |  ¡ ¡| _| j ¡ d | _d S )Né   )Úsuperr   ÚsetUpÚ_close_on_teardownÚ_setup_listenerÚlistenerÚgetsocknameÚport)r   )Ú	__class__r   r   r$   2   s    zTestTCP.setUpc             C   s   t   ¡ }t |d¡ |S )N)z	127.0.0.1r   )ÚsocketÚ	greentestZbind_and_listen)r   r'   r   r   r   r&   G   s    zTestTCP._setup_listenerú	127.0.0.1c             C   sJ   t   ¡ }| ||p| jf¡ |d k	r.| |¡ |d k	r@| |¡ |  |¡S )N)r+   Úconnectr)   Ú
settimeoutÚsetblockingr%   )r   Úhostr)   ÚtimeoutÚblockingZsockr   r   r   Úcreate_connectionL   s    

zTestTCP.create_connectionÚsendallc          	      s”   g ‰ g ‰‡ ‡‡fdd„}t |d}ˆjf |Ž}zt||ƒ|ƒ W d | tj¡ | ¡  X | ¡  |d krnˆj}ˆ 	ˆ d |¡ ˆrt
jˆd Ž  d S )Nc                 s~   d } z\y<ˆj  ¡ \} }| jdd}ˆ  | ¡ ¡ | ¡  | ¡  W n   ˆ t ¡ ¡ Y nX W d | rn|  ¡  ˆj  ¡  X d S )NÚrb)Úmode)	r'   ÚacceptÚmakefileÚappendÚreadÚflushÚcloseÚsysÚexc_info)ÚconnÚ_Úr)Ú	read_datar   Úserver_exc_infor   r   Úaccept_and_read\   s    z.TestTCP._test_sendall.<locals>.accept_and_read)r   r   )r   r4   ÚgetattrÚshutdownr+   Ú	SHUT_RDWRr=   ÚjoinÚ	long_dataÚassertEqualr   Zreraise)r   ÚdataZ
match_dataÚclient_methodZclient_argsrE   ÚserverÚclientr   )rC   r   rD   r   Ú_test_sendallV   s    

zTestTCP._test_sendallc             C   s   |   | j¡ d S )N)rP   rJ   )r   r   r   r   Útest_sendall_str|   s    zTestTCP.test_sendall_strc             C   s   |   t | j¡¡ d S )N)rP   r   Z	text_typerJ   )r   r   r   r   Útest_sendall_unicode€   s    zTestTCP.test_sendall_unicodec             C   s   t   d| j¡}|  |¡ d S )NÚB)ÚarrayrJ   rP   )r   rL   r   r   r   Útest_sendall_arrayƒ   s    zTestTCP.test_sendall_arrayc             C   s   d}|   ||¡ d S )Nó    )rP   )r   rL   r   r   r   Útest_sendall_empty‡   s    zTestTCP.test_sendall_emptyc             C   s   d}| j ||dd d S )NrV   é
   )r2   )rP   )r   rL   r   r   r   Útest_sendall_empty_with_timeout‹   s    z'TestTCP.test_sendall_empty_with_timeoutc             C   s   d}| j ||dd d S )Ns   hi
F)r3   )rP   )r   rL   r   r   r   Útest_sendall_nonblocking   s    z TestTCP.test_sendall_nonblockingc             C   s   d}| j ||dd d S )NrV   Úsend)rM   )rP   )r   rL   r   r   r   Útest_empty_send˜   s    zTestTCP.test_empty_sendc                s~   d‰ ‡ ‡fdd„}t |d}ˆ ¡ }| ¡ }t |jˆ fd}t d¡ | d¡ t d¡ | ¡  | ¡  | ¡  | ¡  d S )Ni † c                 sZ   ˆj  ¡ \‰ } ‡‡ fdd„}t|d}ˆ  d¡}ˆ |d¡ | ¡  ˆ  ¡  ˆj  ¡  d S )Nc                  s   ˆ  dˆ  ¡ d S )Nó   t)r5   r   )ÚNÚremote_clientr   r   r5   ¤   s    z8TestTCP.test_fullduplex.<locals>.server.<locals>.sendall)r   iè  s   hello world)r'   r8   r   ÚrecvrK   rI   r=   )rA   r5   ZsenderÚresult)r^   r   )r_   r   rN       s    

z'TestTCP.test_fullduplex.<locals>.server)r   )r   r   gš™™™™™¹?s   hello world)	r   r4   r9   r;   ÚtimeÚsleepr5   r=   rI   )r   rN   Zserver_threadrO   Úclient_fileZclient_readerr   )r^   r   r   Útest_fullduplex   s    



zTestTCP.test_fullduplexc                s‚   g ‰ t ‡ ‡fdd„d}ˆ ¡ }| d¡ t ¡ }ˆ ˆj|jd¡ t ¡ | }ˆ |dd¡ | ¡  | 	¡  ˆ d d  	¡  d S )	Nc                  s   ˆ   ˆj ¡ ¡S )N)r:   r'   r8   r   )Úclient_sockr   r   r   Ú<lambda>Á   s    z+TestTCP.test_recv_timeout.<locals>.<lambda>)r   r"   i   gÍÌÌÌÌÌì?gš™™™™™ñ?r   )
r   r4   r/   rb   ÚassertRaisesÚTIMEOUT_ERRORr`   ÚassertTimeWithinRangerI   r=   )r   ÚacceptorrO   r   Útookr   )rf   r   r   Útest_recv_timeout¿   s    
zTestTCP.test_recv_timeoutTs   helloi áõz2On Windows send() accepts whatever is thrown at itc          	      s´   g ‰ t ‡ ‡fdd„d}ˆ ¡ }t d¡ ˆ s2t‚| d¡ t ¡ }zHˆ ˆj¡ | ˆj	¡ W d Q R X ˆj
rŠt ¡ | }ˆ |dd¡ W d | ¡  | ¡  ˆ d d  ¡  X d S )Nc                  s   ˆ   ˆj ¡ ¡S )N)r:   r'   r8   r   )rf   r   r   r   rg   Ú   s    z.TestTCP.test_sendall_timeout.<locals>.<lambda>)r   gš™™™™™¹?g
×£p=
·?gš™™™™™É?r   )r   r4   rb   rc   ÚAssertionErrorr/   rh   ri   r5   Ú_test_sendall_dataÚ _test_sendall_timeout_check_timerj   rI   r=   )r   rk   rO   r   rl   r   )rf   r   r   Útest_sendall_timeout×   s     

zTestTCP.test_sendall_timeoutc                sj   ‡ fdd„}t |d}ˆ  ¡ }|jdd}| ¡  | ¡ }ˆ  |d¡ ˆ  | ¡ d¡ | ¡  | ¡  d S )Nc                 sJ   ˆ j  ¡ \} }| jdd}| d¡ | ¡  | ¡  |  ¡  ˆ j  ¡  d S )NÚwb)r7   s   hello
)r'   r8   r9   Úwriter<   r=   )r@   rA   Úfd)r   r   r   Úaccept_onceì   s    
z*TestTCP.test_makefile.<locals>.accept_once)r   r6   )r7   s   hello
rV   )r   r4   r9   r=   ÚreadlinerK   r;   rI   )r   ru   rk   rO   rd   Úliner   )r   r   Útest_makefileë   s    	
zTestTCP.test_makefilec                s`   ‡ fdd„}t |d}ˆ  ¡ }| d¡ |jdd}ˆ  ˆ j|j¡ | ¡  | ¡  | ¡  d S )Nc                 s,   ˆ j  ¡ \} }zt d¡ W d |  ¡  X d S )Ng333333Ó?)r'   r8   rb   rc   r=   )r@   rA   )r   r   r   ru     s    z2TestTCP.test_makefile_timeout.<locals>.accept_once)r   gš™™™™™¹?r6   )r7   )	r   r4   r/   r9   rh   ri   rv   r=   rI   )r   ru   rk   rO   rt   r   )r   r   Útest_makefile_timeout   s    

zTestTCP.test_makefile_timeoutc             C   s¼   t   t jt jd¡}|  t j|j¡ |  t j|j¡ |  d|j¡ tt dƒr°| d¡ |  t j|j¡ | 	d¡ t
 dd¡t jt jdƒ}z| 	d¡ |  |j|j¡ W d | ¡  X | ¡  d S )Nr   ZSOCK_NONBLOCKr"   r+   )r+   ÚAF_INETZ
SOCK_DGRAMrK   ÚtypeZfamilyÚprotoÚhasattrr/   r0   r   Zget_originalr=   )r   ÚsZ
std_socketr   r   r   Útest_attributes  s    




zTestTCP.test_attributesc             C   sD   t   t jt j¡}| d¡ | tjtƒ f¡}|  |t	¡ | 
¡  d S )NF)r+   rz   ÚSOCK_STREAMr0   Ú
connect_exr,   ÚDEFAULT_LOCAL_HOST_ADDRÚget_portZassertIsInstanceÚerrno_typesr=   )r   r~   Zretr   r   r   Ú*test_connect_ex_nonblocking_bad_connection&  s
    
z2TestTCP.test_connect_ex_nonblocking_bad_connectionc          	   C   sD   t   t jt j¡}|  t j¡ | dtƒ f¡ W d Q R X | ¡  d S )Nzfoo.bar.fizzbuzz)r+   rz   r€   rh   Zgaierrorr   rƒ   r=   )r   r~   r   r   r   Útest_connect_ex_gaierror.  s    z TestTCP.test_connect_ex_gaierrorc          	   C   sL   t   t jt j¡}| d¡ |  t¡ | tjdf¡ W d Q R X | 	¡  d S )NFi  )
r+   rz   r€   r0   rh   ÚOverflowErrorr   r,   r‚   r=   )r   r~   r   r   r   Ú$test_connect_ex_nonblocking_overflow5  s
    
z,TestTCP.test_connect_ex_nonblocking_overflowÚSOCK_CLOEXECzRequires SOCK_CLOEXECc                sx   t j}t   t jt j|B ¡}‡ fdd„}t|d}| dˆ jf¡ |jdd}ˆ  | 	¡ d¡ | 
¡  | 
¡  | ¡  d S )Nc                 s8   ˆ j  ¡ \} }| jdd}| d¡ | ¡  |  ¡  d S )Nrr   )r7   s   hello
)r'   r8   r9   rs   r=   )r@   rA   rt   )r   r   r   ru   F  s
    
zATestTCP.test_connect_with_type_flags_ignored.<locals>.accept_once)r   z	127.0.0.1r6   )r7   s   hello
)r+   r‰   rz   r€   r   r.   r)   r9   rK   rv   r=   rI   )r   r‰   r~   ru   rk   rt   r   )r   r   Ú$test_connect_with_type_flags_ignored=  s    
z,TestTCP.test_connect_with_type_flags_ignored)r-   NNN)Nr5   ),r   r   r   Ú__timeout__r+   r2   ri   rI   ÚrangerJ   Ú
isinstanceÚbytesÚencoder$   r&   r4   rP   rQ   r   ZPY3rR   rU   rW   rY   rZ   r\   re   rm   rp   ro   r,   ZskipOnWindowsrq   rx   ry   r   r…   r†   rˆ   ÚunittestZ
skipUnlessr}   rŠ   Ú__classcell__r   r   )r*   r   r   *   s>   

 
	
&"r   c              C   s*   t   ¡ } |  d¡ |  ¡ d }|  ¡  |S )N)Ú r   r"   )r+   Zbindr(   r=   )Ztempsockr)   r   r   r   rƒ   W  s
    
rƒ   c               @   s&   e Zd ZeZdd„ Zejdd„ ƒZdS )ÚTestCreateConnectionc          	   C   sT   |   tj¡$}tjtjtƒ fddtƒ fd W d Q R X |j}|  dt	|ƒ 
¡ ¡ d S )Né   r’   )r2   Zsource_addressZrefused)rh   r+   Úerrorr4   r,   ZDEFAULT_BIND_ADDRrƒ   Z	exceptionZassertInr   Úlower)r   ÚcmÚexr   r   r   Útest_refusesc  s    z!TestCreateConnection.test_refusesc          	      sÄ   G dd„ dt ƒ‰ G ‡ ‡fdd„dtƒ‰dd„ }dd lm} |  |jtj¡ |j}|j}zTˆ|_||_|  ˆ ¡ t d¡ W d Q R X |  d	tˆj	ƒ¡ |  
ˆj	d j¡ W d d
ˆ_	||_||_X d S )Nc               @   s   e Zd ZdS )z3TestCreateConnection.test_base_exception.<locals>.EN)r   r   r   r   r   r   r   ÚEo  s   rš   c                   s4   e Zd ZdZdZ‡fdd„Z‡ fdd„Zdd„ Zd	S )
z<TestCreateConnection.test_base_exception.<locals>.MockSocketr   Fc                s   ˆ  j | f7  _ d S )N)Úcreated)r   rA   )Ú
MockSocketr   r   r   w  s    zETestCreateConnection.test_base_exception.<locals>.MockSocket.__init__c                s
   ˆ ƒ ‚d S )Nr   )r   rA   )rš   r   r   r.   z  s    zDTestCreateConnection.test_base_exception.<locals>.MockSocket.connectc             S   s
   d| _ d S )NT)Úclosed)r   r   r   r   r=   }  s    zBTestCreateConnection.test_base_exception.<locals>.MockSocket.closeN)r   r   r   r›   r   r   r.   r=   r   )rš   rœ   r   r   rœ   r  s
   rœ   c              W   s   dgS )N)r"   r   é   rž   é   r   )rA   r   r   r   Úmockgetaddrinfo€  s    zATestCreateConnection.test_base_exception.<locals>.mockgetaddrinfor   )r1   r)   r"   r   )ÚBaseExceptionÚobjectÚgevent.socketr+   rK   r4   Zgetaddrinforh   Úlenr›   Z
assertTruer   )r   r    ZgsocketZorig_socketZorig_getaddrinfor   )rš   rœ   r   Útest_base_exceptionk  s"    z(TestCreateConnection.test_base_exceptionN)	r   r   r   r   r‹   r™   r,   Úignores_leakcheckr¥   r   r   r   r   r“   _  s   r“   c               @   s"   e Zd Zejdd„ ƒZdd„ ZdS )ÚTestFunctionsc          	      sT   dd l ‰ dd l‰ G ‡ fdd„dtƒ}|  ˆ jj¡ ˆ jj|ƒ dd W d Q R X d S )Nr   c                   s   e Zd ZdZ‡ fdd„ZdS )z+TestFunctions.test_wait_timeout.<locals>.ioNc                s   ˆ   d¡ d S )NrX   )rc   )r   Z_args)Úgeventr   r   r   ¤  s    z1TestFunctions.test_wait_timeout.<locals>.io.start)r   r   r   Úcallbackr   r   )r¨   r   r   Úio¡  s   rª   g{®Gáz„?)r2   )r£   Zgevent._socketcommonr¢   rh   r+   r2   Úwait)r   rª   r   )r¨   r   Útest_wait_timeoutš  s
    zTestFunctions.test_wait_timeoutc             C   s:   g }t jr(| d¡ | d¡ | d¡ | jd|d d S )NZgethostbynameZgethostbyname_exZgethostbyaddrr+   )Úexclude)r,   ZPYPYr:   Z!assertMonkeyPatchedFuncSignatures)r   r­   r   r   r   Útest_signatures«  s    


zTestFunctions.test_signaturesN)r   r   r   r,   r¦   r¬   r®   r   r   r   r   r§   ˜  s   r§   c               @   s   e Zd Zdd„ ZdS )Ú
TestSocketc          	   C   s8   t   ¡ }| ¡  |  t j¡ | t j¡ W d Q R X d S )N)r+   r=   rh   r•   rG   rH   )r   r~   r   r   r   Útest_shutdown_when_closed»  s    z$TestSocket.test_shutdown_when_closedN)r   r   r   r°   r   r   r   r   r¯   ¹  s   r¯   Ú__main__)r¨   r   Z	patch_allr>   r
   rT   r+   r   rb   r   Zgevent.testingZtestingr,   Ú	functoolsr   r   r   Z	threadingr   r   Úintr„   r   ZTestCaser   rƒ   r“   r§   r¯   r   Úmainr   r   r   r   Ú<module>   s2    	  /9!

