o
    e[                     @   s  d dl mZ d dl mZ 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m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 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 d dlmZ eZ G dd de!Z"G dd de"Z#e$dsG dd de"eZ%e%Zne#ZG dd dej&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re,  dS dS )     )print_function)absolute_import)monkeyN)wraps)reraise)six)LARGE_TIMEOUT)support)paramstcp_listener)skipWithoutExternalNetwork)skipOnMacOnCI)Thread)Eventc                   @      e Zd ZdZdd ZdS )
BaseThreadNc                    s    t  fdd}| _d S )Nc                     s$   z| i |W S    t   _ N)sysexc_infoterminal_exc)argskwargsselftarget ID:\Projects\ConvertPro\env\Lib\site-packages\gevent/tests/test__socket.pyerrors_are_fatal+   s
   
z-BaseThread.__init__.<locals>.errors_are_fatal)r   r   )r   r   r   r   r   r   __init__*   s   
zBaseThread.__init__)__name__
__module____qualname__r   r   r   r   r   r   r   '       r   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
GreenletThreadNr   c                 C   s&   t | | tj| jg|R  | _d S r   )r   r   geventZspawnr   glet)r   r   r   r   r   r   r   6   s   zGreenletThread.__init__c                 O   s   | j j|i |S r   )r&   join)r   r   r   r   r   r   r'   :   s   zGreenletThread.joinc                 C   s   | j   S r   )r&   readyr   r   r   r   is_alive=   s   zGreenletThread.is_alive)Nr   )r    r!   r"   r   r'   r*   r   r   r   r   r$   4   s    
r$   	threadingc                   @      e Zd Zdd ZdS )ThreadThreadc                 K   s:   | d}t| | tj| fd| ji| |   d S )Nr   )popr   r   _Threadr   start)r   r   r   r   r   r   r   B   s   
zThreadThread.__init__N)r    r!   r"   r   r   r   r   r   r-   A       r-   c                       sH  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		d<ddZd=ddZdd Zejr@dd Zed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%e&d1d2d3 Z'e&d1d4d5 Z(d6d7 Z)e*+e,ed8d9d:d; Z-  Z.S )>TestTCPNz, c                 C   s   g | ]}t |qS r   )str).0xr   r   r   
<listcomp>N   s    zTestTCP.<listcomp>i N  asciic                    s   t t|   dtjv r;g zddlm W n ty%   ddlm Y nw fdd | j fdd}|| _nd	d   | _	| | 
 | _| j d
 | _d S )Nz-vr   )perf_counter)timec                     s.   s
t   d t d   g| R   d S )N   z
	 -> %0.6f)printappend)r   )nowprintedr   r   logZ   s   
zTestTCP.setUp.<locals>.logc                    s&    d|  | f fdd	}| | S )NzRegistering for teardownc                    s    d|  |    d } d S )NzClosing on teardown)close)o)r?   r   r   cc   s   
z%TestTCP.setUp.<locals>.cot.<locals>.cr   )rA   rB   )r?   orig_cotr   r   cota   s   
zTestTCP.setUp.<locals>.cotc                  W   s   dS )zDoes nothingNr   )_argsr   r   r   r?   l   s    r:   )superr2   setUpr   argvr9   r8   ImportError_close_on_teardownr?   _setup_listenerlistenergetsocknameport)r   rD   	__class__)r?   r=   rC   r>   r   rG   R   s    
zTestTCP.setUpc                 C   s   t  S r   r   r)   r   r   r   rK         zTestTCP._setup_listenerc                 C   sP   |  t }||ptj|p| jf |d ur|| |d ur&|| |S r   )rJ   socketconnectr
   DEFAULT_CONNECTrN   
settimeoutsetblocking)r   hostrN   timeoutblockingsockr   r   r   create_connection   s   

zTestTCP.create_connectionsendallc           	         s  j d| g t   fdd}t|d}zd jdi |}   d|dt| zCt|||}d| W d	 t|d
r^z| }W n t	t
fy]   Y nw z|tj W n	 t
yo   Y nw d |  n6d	 t|d
rz| }W n t	t
fy   Y nw z|tj W n	 t
y   Y nw d |  w W |d | rJ n|d | rJ w |jrt|j  |d u r׈j}d d|d}d |d  tt| | d S )Nztest_sendall using methodc                     s   dj  j  \} }z@| jdd)}d| d|    d |  d|dtd	  W d    n1 s@w   Y  ~W |   ~ d S |   ~ w )
Nz
	acceptingrbmodez#	accepted on server; client conn iszfile isz	readingz	done readingz	got bytesr   )rL   acceptmakefilesetr<   readlenr@   )conn_rZaccepted_eventr?   	read_datar   r   r   accept_and_read   s   z.TestTCP._test_sendall.<locals>.accept_and_readr   zcreating client connectionz%Client got accepted event from serverz; sending dataz$Client sent data: result from methodzClient will unwrap and shutdownunwrapzClient will close
   r      ,r   )r?   r   r   r[   waitrd   getattrhasattrrl   
ValueErrorOSErrorshutdownrR   	SHUT_RDWRr@   r'   r*   r   r   	long_datasplitassertEqual)	r   dataZ
match_dataclient_methodZclient_argsrj   serverclientr5   r   rh   r   _test_sendall   sn   










zTestTCP._test_sendallc                 C   s   |  | j d S r   )r}   rv   r)   r   r   r   test_sendall_str   s   zTestTCP.test_sendall_strc                 C   s   |  t| j d S r   )r}   r   	text_typerv   r)   r   r   r   test_sendall_unicode   s   zTestTCP.test_sendall_unicodez3Sometimes fails for no apparent reason (buffering?)c                 C   s   t  d| j}| | d S )NB)arrayrv   r}   r   ry   r   r   r   test_sendall_array   s   zTestTCP.test_sendall_arrayc                 C   s   d}|  || d S )N    r}   r   r   r   r   test_sendall_empty   s   zTestTCP.test_sendall_emptyc                 C      d}| j ||dd d S )Nr   rm   rX   r   r   r   r   r   test_sendall_empty_with_timeout      z'TestTCP.test_sendall_empty_with_timeoutc                 C   r   )Ns   hi
F)rY   r   r   r   r   r   test_sendall_nonblocking  s   z TestTCP.test_sendall_nonblockingc                 C   r   )Nr   send)rz   r   r   r   r   r   test_empty_send
  r   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                     s\   j  \} }|  t| jd  fd}z| d}|d W |  d S |  w )N   tr   r   i     hello world)rL   r`   rJ   r   r\   recvrx   r'   )Zremote_clientrf   ZsenderresultNr   r   r   r{     s   

z'TestTCP.test_fullduplex.<locals>.serverrk   r   皙?r   )
r   r[   rJ   ra   rc   r9   sleepr\   r@   r'   )r   r{   Zserver_threadr|   client_fileZclient_readerr   r   r   test_fullduplex  s   



zTestTCP.test_fullduplexc                    s    fdd}t |d}  }z8|d t }  j |d W d    n1 s/w   Y  t | } |dd W |  d S |  w )Nc                     s    j  \} } |  d S r   )rL   r`   rJ   re   rf   r)   r   r   r`   1  s   z)TestTCP.test_recv_timeout.<locals>.acceptrk   r:   i   g?g?)	r   r[   rU   r9   assertRaisesTIMEOUT_ERRORr   assertTimeWithinRanger'   )r   r`   acceptorr|   r0   tookr   r)   r   test_recv_timeout0  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  sJ |d t }zRj |j W d    n1 s:w   Y  j	rbt | }
|dd W |  |   d d   d S W |  |   d d   d S |  |   d d   w )Nc                      s     j S r   )r<   rL   r`   r   Zclient_sockr   r   r   <lambda>R  s    z.TestTCP.test_sendall_timeout.<locals>.<lambda>rk   r   g
ףp=
?g?r   )r   r[   r9   r   rU   r   r   r\   _test_sendall_data _test_sendall_timeout_check_timer   r'   r@   )r   r   r|   r0   r   r   r   r   test_sendall_timeoutO  s0   

zTestTCP.test_sendall_timeoutc                    sx    fdd}t |d}z+  }|jdd}|  | } |d  | d |  W |  d S |  w )Nc                     s@    j  \} }| jdd}|d |  |  |   d S Nwbr^      hello
)rL   r`   ra   writeflushr@   re   rf   fdr)   r   r   accept_onced  s   
z*TestTCP.test_makefile.<locals>.accept_oncerk   r]   r^   r   r   )r   r[   ra   r@   readlinerx   rc   r'   )r   r   r   r|   r   liner   r)   r   test_makefilec  s   

zTestTCP.test_makefilec                    sn    fdd}t |d}z&  }|d |jdd}  j|j |  |  W |  d S |  w )Nc                     s2    j  \} }ztd W |   d S |   w )Ng333333?)rL   r`   r9   r   r@   r   r)   r   r   r   {  s   z2TestTCP.test_makefile_timeout.<locals>.accept_oncerk   r   r]   r^   )	r   r[   rU   ra   r   r   r   r@   r'   )r   r   r   r|   r   r   r)   r   test_makefile_timeouty  s   


zTestTCP.test_makefile_timeoutc                 C   s   t  t jt jd}| |jt j | |jt j | d|j tt dr\|	d | |jt j |
d tddt jt jd}z|
d | |j|j W |  n|  w |  d S )Nr   ZSOCK_NONBLOCKr:   rR   )rR   AF_INET
SOCK_DGRAMassertIsfamilyrx   typeprotorq   rU   rV   r   Zget_originalr@   )r   sZ
std_socketr   r   r   test_attributes  s   



zTestTCP.test_attributesc                 C   sT   t  t jt j}z|d |tjt f}| 	|t
 W |  d S |  w )NF)rR   r   SOCK_STREAMrV   
connect_ex	greentestDEFAULT_LOCAL_HOST_ADDRr	   find_unused_portZassertIsInstanceerrno_typesr@   )r   r   retr   r   r   *test_connect_ex_nonblocking_bad_connection  s   
z2TestTCP.test_connect_ex_nonblocking_bad_connectionTries to resolve hostnamec                 C   sv   t  t jt j}z-| t j |dt f W d    n1 s#w   Y  W |  d S W |  d S |  w Nzfoo.bar.fizzbuzz)	rR   r   r   r   gaierrorr   r	   r   r@   r   r   r   r   r   test_connect_ex_gaierror  s   z TestTCP.test_connect_ex_gaierrorc                    s    fdd}t  t jt j} t d |_W d    n1 s!w   Y  |  G dd dt j }|t jt j}|| d S )Nc                    sf   z-  tj | dt f W d    n1 sw   Y  W |   d S W |   d S |   w r   )r   rR   r   r   r	   r   r@   )rZ   r)   r   r   do_it  s   z7TestTCP.test_connect_ex_not_call_connect.<locals>.do_itc                   @   r,   )z3TestTCP.test_connect_ex_not_call_connect.<locals>.Sc                 W   s   t d)NzShould not be called)AssertionError)r   r   r   r   r   rS        z;TestTCP.test_connect_ex_not_call_connect.<locals>.S.connectN)r    r!   r"   rS   r   r   r   r   S  r1   r   )rR   r   r   r   AttributeErrorrS   r@   )r   r   r   r   r   r)   r    test_connect_ex_not_call_connect  s   z(TestTCP.test_connect_ex_not_call_connectc                 C   s|   t  t jt j}z0|d | t |tjdf W d    n1 s&w   Y  W |	  d S W |	  d S |	  w )NFi  )
rR   r   r   rV   r   OverflowErrorr   r   r   r@   r   r   r   r   $test_connect_ex_nonblocking_overflow  s   
z,TestTCP.test_connect_ex_nonblocking_overflowSOCK_CLOEXECzRequires SOCK_CLOEXECc                    s   t j}t  t jt j|B } fdd}t|d}z&|tj jf |j	dd} 
| d |  |  W |  d S |  w )Nc                     s8    j  \} }| jdd}|d |  |   d S r   )rL   r`   ra   r   r@   r   r)   r   r   r     s
   
zATestTCP.test_connect_with_type_flags_ignored.<locals>.accept_oncerk   r]   r^   r   )rR   r   r   r   r   rS   r
   rT   rN   ra   rx   r   r@   r'   )r   r   r   r   r   r   r   r)   r   $test_connect_with_type_flags_ignored  s   

z,TestTCP.test_connect_with_type_flags_ignored)NNNN)Nr\   )/r    r!   r"   __timeout__rR   rX   r   r'   rangerv   
isinstancebytesencoderG   rK   r[   r}   r~   r   PY2r   r   r   r   r   r   r   r   r   r   r   r   ZskipOnWindowsr   r   r   r   r   r   r   r   r   unittestZ
skipUnlessrq   r   __classcell__r   r   rO   r   r2   K   sP    

/


_
!


	

r2   c                   @   s6   e Zd ZeZdd Zdd Zeje	ddd Z
dS )	TestCreateConnectionc                 K   sX   t  }| tjd tjtj|ffddi| W d    d S 1 s%w   Y  d S )Nz5refused|not known|already in use|assign|not availablerX      )r	   r   assertRaisesRegexrR   errorr[   r   ZDEFAULT_BIND_ADDR)r   Z	conn_argsZconnect_portr   r   r   test_refuses  s   "z!TestCreateConnection.test_refusesc                 C   s   t  }| jd|fd d S )N )source_address)r	   r   r   )r   Zsource_portr   r   r   test_refuses_from_port  s   z+TestCreateConnection.test_refuses_from_portr   c                    s   G dd dt  G  fdddtdd }dd lm} | |jtj |j}|j}z>|_||_|   td W d    n1 sGw   Y  | d	tj	 | 
j	d j W d
_	||_||_d S d
_	||_||_w )Nc                   @   s   e Zd ZdS )z3TestCreateConnection.test_base_exception.<locals>.EN)r    r!   r"   r   r   r   r   E  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 r   )createdr   rf   )
MockSocketr   r   r   $  s   zETestCreateConnection.test_base_exception.<locals>.MockSocket.__init__c                    s    |r   r   r   )r   r   r   rS   '  r   zDTestCreateConnection.test_base_exception.<locals>.MockSocket.connectc                 S   s
   d| _ d S )NT)closedr)   r   r   r   r@   *  s   
zBTestCreateConnection.test_base_exception.<locals>.MockSocket.closeN)r    r!   r"   r   r   r   rS   r@   r   r   r   r   r   r     s    r   c                  W   s   dgS )N)r:         r      r   )rf   r   r   r   mockgetaddrinfo-  rQ   zATestCreateConnection.test_base_exception.<locals>.mockgetaddrinfor   )rW   rN   r:   r   )BaseExceptionobjectZgevent.socketrR   rx   r[   getaddrinfor   rd   r   
assertTruer   )r   r   gsocketZorig_socketZorig_getaddrinfor   r   r   test_base_exception  s*   
z(TestCreateConnection.test_base_exceptionN)r    r!   r"   r   r   r   r   r   ignores_leakcheckr   r   r   r   r   r   r     s    r   c                   @   s*   e Zd Zejdd Zdd Zdd ZdS )TestFunctionsc                 C   s^   ddl m} G dd dt}| |j |j| dd W d    d S 1 s(w   Y  d S )Nr   )rR   c                   @   r   )z+TestFunctions.test_wait_timeout.<locals>.ioNc                 W   s   t d d S )Nrm   )r%   r   )r   rE   r   r   r   r0   O  s   z1TestFunctions.test_wait_timeout.<locals>.io.start)r    r!   r"   callbackr0   r   r   r   r   ioL  r#   r   g{Gz?r   )r%   rR   r   r   rX   ro   )r   r   r   r   r   r   test_wait_timeoutG  s
   "zTestFunctions.test_wait_timeoutc                 C   sV   g }t jr|d |d |d tjd d dk r"|d | jd|d d S )	Ngethostbynamegethostbyname_exgethostbyaddrr   )r      r[   rR   )exclude)r   ZPYPYr<   r   version_infoZ!assertMonkeyPatchedFuncSignatures)r   r   r   r   r   test_signaturesV  s   



zTestFunctions.test_signaturesc                    sd   ddl m   jjs| d t jds| d d}G  fdddt}| | || d S )	Nr   )_socketcommonz
Needs IPv6	inet_ptonzNeeds inet_pton)z2607:f8b0:4000:80e::200eP   r   	   c                       s   e Zd Z jZdS )z6TestFunctions.test_resolve_ipv6_scope_id.<locals>.sockN)r    r!   r"   AF_INET6r   r   ZSCr   r   rZ   r  s    
rZ   )	r%   r   Z
__socket__has_ipv6ZskipTestrq   r   r   Z_resolve_addr)r   addrrZ   r   r  r   test_resolve_ipv6_scope_idh  s   

z(TestFunctions.test_resolve_ipv6_scope_idN)r    r!   r"   r   r   r   r   r  r   r   r   r   r   E  s
    
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )
TestSocketc                 C   sN   t   }|  | t j |t j W d    d S 1 s w   Y  d S r   )rR   r@   r   r   rt   ru   r   r   r   r   test_shutdown_when_closedx  s
   "z$TestSocket.test_shutdown_when_closedc                 C   s>   dd l }t }z||}| | W |  d S |  w )Nr   )weakrefrR   refZassertIsNotNoner@   )r   r  r   wr   r   r   test_can_be_weak_ref  s   
zTestSocket.test_can_be_weak_refc                 C   sd   t   }z(| t t|d W d    n1 sw   Y  W |  d S W |  d S |  w )N__dict__)rR   r   r   rp   r@   r   r   r   r   test_has_no_dict  s   zTestSocket.test_has_no_dictN)r    r!   r"   r  r  r  r   r   r   r   r  v  s    
r  __main__)-
__future__r   r   r%   r   Z	patch_allr   r   rR   r9   r   	functoolsr   Zgevent._compatr   Zgevent.testingtestingr   r   r   r	   r
   Zgevent.testing.socketsr   Zgevent.testing.skippingr   r   r+   r   r/   r   intr   r   r   r$   Zis_module_patchedr-   ZTestCaser2   r   r   r  r    mainr   r   r   r   <module>   sN    
   ,Q1