U
    g*                     @  s   d dl m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
mZ ddlT ddlmZmZmZ dd	lmZ d
dddZd
dddZdd
dddZd
dddZd
dddZd
dddZd
dddZd
dddZdS )    )annotationsN)Sequence   )_coresocket)*)assert_checkpointscheck_half_closeable_streamwait_all_tasks_blocked   )setsockopt_testsNonereturnc            	        s  t  \} }| 4 |$ tt t|  W 5 Q R X W 5 Q R X W 5 Q R X tjtjd(}tjt	dd t| W 5 Q R X W 5 Q R X t \}}|, | t|}|j|kst
W 5 Q R X W 5 Q R X t }|dI d H  |d t }|| I d H  t|}|tjtjs(t
|tjtjd |tjtjrPt
|tjtjd}t|tsrt
t| W 5 Q R X W 5 Q R X d S )Ntypez,^SocketStream requires a SOCK_STREAM socket$matchz	127.0.0.1r   r   F)stdlib_socket
socketpairpytestraises	TypeErrorSocketStreamtsocketr   
SOCK_DGRAM
ValueErrorAssertionErrorbindlistenconnectgetsockname
getsockoptIPPROTO_TCPTCP_NODELAY
setsockopt
isinstancebytesr   )	Zstdlib_aZstdlib_bsockabslisten_sockclient_sockres r0   E/tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_highlevel_socket.pytest_SocketStream_basics   s4    &"


r2   c                    s   d t  \} }|  | t| t|dd fdd}dd fdd}t 4 I d H }|| || W 5 Q I d H R X dI d H  d	I d H dkst	 I d H  d	I d H d
kstW 5 Q R X W 5 Q R X d S )Ni r   r   c                    s(   t  } | I d H  | t 7 } d S N)	bytearraysend_allr(   )data)BIGr*   r0   r1   senderK   s    z*test_SocketStream_send_all.<locals>.senderc                    sB   t  I d H  d} |  k r2| t I d H 7 } q|  ks>td S )Nr   )r
   lenreceive_somer   )nbytes)r7   r+   r0   r1   receiverc   s
    z,test_SocketStream_send_all.<locals>.receiver   e
       )
r   r   r   r   open_nursery
start_soonr5   r:   r   Zsend_eof)Za_sockZb_sockr8   r<   nurseryr0   )r7   r*   r+   r1   test_SocketStream_send_all@   s    
rC   r   )r,   r   c              
     s^   dd fdd}ddddd}t  4 I d H }|| ||| W 5 Q I d H R X d S )	Nr   r   c                     s     dd I d H  q d S )N   xi'  )r5   r0   r,   r0   r1   r8   x   s    zfill_stream.<locals>.senderz_core.Nursery)rB   r   c                   s   t  I d H  | j  d S r3   )r
   Zcancel_scopecancel)rB   r0   r0   r1   waiter|   s    zfill_stream.<locals>.waiter)r   r@   rA   )r,   r8   rG   rB   r0   rE   r1   fill_streamw   s
    
rH   c                    s4   dddd dd fdd} t  | I d H  d S )Nz!tuple[SocketStream, SocketStream]r   c                    s   t  \} }t| t|fS r3   )r   r   r   leftrightr0   r0   r1   stream_maker   s    z/test_SocketStream_generic.<locals>.stream_makerc                    s4     I d H \} }t | I d H  t |I d H  | |fS r3   )rH   rI   rL   r0   r1   clogged_stream_maker   s    z7test_SocketStream_generic.<locals>.clogged_stream_maker)r	   )rN   r0   rM   r1   test_SocketStream_generic   s    rO   c               
     s>  t  8} | d | d tt t|  W 5 Q R X W 5 Q R X tjtj	dB} | dI d H  tjt
dd}t|  W 5 Q R X |d W 5 Q R X tjdkrt B} | dI d H  tjt
dd}t|  W 5 Q R X |d	 W 5 Q R X t }|dI d H  |d t|}|j|ks0tt }|| I d H  t  | I d H }W 5 Q R X t|ts|t|j | kst|j | kstt  | I d H  W 5 Q R X t  | I d H  W 5 Q R X t , ttj | I d H  W 5 Q R X W 5 Q R X |  | I d H  d S )
Nr   r>   r   z.^SocketListener requires a SOCK_STREAM socket$r   z.*SOCK_STREAMdarwinz,^SocketListener requires a listening socket$z.*listen)r   r   r   r    r   r   r   SocketListenerr   r   r   r   sysplatformr   r!   r"   r   acceptr'   r   getpeernameacloser   ClosedResourceErrorclose)r,   excinfor-   listenerr.   Zserver_streamr0   r0   r1   test_SocketListener   sZ    





"r[   c               
     sn   t  } | dI d H  | d t| }|   t , tt	j
 | I d H  W 5 Q R X W 5 Q R X d S )Nr   r>   )r   r   r   r    rQ   rX   r   r   r   r   rW   rT   )r-   rZ   r0   r0   r1   +test_SocketListener_socket_closed_underfoot   s    
r\   c                    s:  G dd dt j} | g }| ttjdttjdttjd|ttjdttjdttj	d|g}t
|}t " | I d H }|j|kstW 5 Q R X tjd	tjd
tj	di D ]R\}}t > tjt|d}| I d H  W 5 Q R X |jj|kstW 5 Q R X qt $ | I d H }|j|ks,tW 5 Q R X d S )Nc                   @  s   e Zd ZdddddZejZedddddd	Zedddd
ddd	Zdddddddd	ZedddddddZ	eddddddddZ	dddddddddZ	ddddZ
dS )z5test_SocketListener_accept_errors.<locals>.FakeSocketz$Sequence[SocketType | BaseException]r   )eventsr   c                 S  s   t || _d S r3   )iter_events)selfr]   r0   r0   r1   __init__   s    z>test_SocketListener_accept_errors.<locals>.FakeSocket.__init__int)leveloptnamer   c                S  s   d S r3   r0   )r`   rc   rd   r0   r0   r1   r#      s    z@test_SocketListener_accept_errors.<locals>.FakeSocket.getsockoptr(   )rc   rd   buflenr   c                S  s   d S r3   r0   r`   rc   rd   re   r0   r0   r1   r#      s    Nz
int | Nonezint | bytesc                S  s   dS )NTr0   rf   r0   r0   r1   r#      s    zint | Buffer)rc   rd   valuer   c                S  s   d S r3   r0   )r`   rc   rd   rg   r0   r0   r1   r&      s    z@test_SocketListener_accept_errors.<locals>.FakeSocket.setsockopt)rc   rd   rg   optlenr   c                S  s   d S r3   r0   r`   rc   rd   rg   rh   r0   r0   r1   r&     s    zint | Buffer | Nonec                S  s   d S r3   r0   ri   r0   r0   r1   r&     s    ztuple[SocketType, object]r   c                   s4   t  I d H  t| j}t|tr(|n|d fS d S r3   )r   
checkpointnextr_   r'   BaseException)r`   eventr0   r0   r1   rT     s
    

z<test_SocketListener_accept_errors.<locals>.FakeSocket.accept)N)N)__name__
__module____qualname__ra   r   SOCK_STREAMr   overloadr#   r&   rT   r0   r0   r0   r1   
FakeSocket   s    	 
rs   zConnection abortedzPermission deniedzBad protocolzOut of file descriptorsz$attempt to write to read-only memoryzout of buffersz$\[\w+ \d+\] Out of file descriptors$z1\[\w+ \d+\] attempt to write to read-only memory$z\[\w+ \d+\] out of buffers$r   )r   
SocketTypeOSErrorerrnoECONNABORTEDEPERMZEPROTOZEMFILEZEFAULTZENOBUFSrQ   r   rT   r   r   itemsr   r   rg   )rs   Zfake_server_sockZfake_listen_sockrZ   streamcoder   rY   r0   r0   r1   !test_SocketListener_accept_errors   s>    A





   r|   c               
     s   t  \} }| f |V |dI d H  |  t| }|dI d H dksPt|dI d H dkshtW 5 Q R X W 5 Q R X d S )NrD   r   r?   )r   r   sendrX   r   r:   r   )Zsock_aZsock_brz   r0   r0   r1   5test_socket_stream_works_when_peer_has_already_closedC  s    r~   )
__future__r   rv   r   r   rR   typingr   r    r   r   Z_highlevel_socketZtestingr   r	   r
   Ztest_socketr   r2   rC   rH   rO   r[   r\   r|   r~   r0   r0   r0   r1   <module>   s"   ,7;f