U
    g2&                     @   s  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 ejdkrLdZ	nejdkr\dZ	ndZ	edd	d
Z
ddddZddddZddddZejjejdkddddddZejjejdkd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S )!    N)FakeNetlinuxz<^\[Errno 107\] (Transport endpoint is|Socket) not connected$darwinz&^\[Errno 57\] Socket is not connected$z^\[Errno 10057\] Unknown error$)returnc                  C   s   t  } |   | S N)r   enable)fn r	   </tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_fakenet.pyr      s    r   c               	      sr  t   tjjtjjd} tjjtjjd}| dI d H  |  \}}|dksRt|dks^ttjt	dd}| dI d H  W 5 Q R X |j
jtjksttjt	dd}|d|fI d H  W 5 Q R X |j
jtjkst|d	|  I d H  | d
I d H \}}|d	kst|| ks$t| d| I d H  |d
I d H \}}|dks\t||  ksntd S )Ntype	127.0.0.1r   r   r   z^\[\w+ \d+\] Invalid argument$match)z	192.0.2.1r   z7^\[\w+ \d+\] (Address (already )?in use|Unknown error)$   xyz
      abc)r   triosocket
SOCK_DGRAMbindgetsocknameAssertionErrorpytestraisesOSErrorvalueerrnoEINVALZ
EADDRINUSEsendtorecvfrom)s1s2ipportexcdataaddrr	   r	   r
   test_basic_udp   s:    r)   c                     sh   t   tjjtjjd} tjjtjjd}| dI d H  |d|  I d H  | dI d H \}}d S )Nr   r   r   r   )r   r   r   r   r   r    r   r!   )r"   r#   r'   r(   r	   r	   r
   test_msg_trunc=   s    r*   c               	      s  t   tjjtjjd} tjjtjjd}tjtdd |dI dH  W 5 Q R X | dI dH  | 	 \}}|dks|t
|dkst
|d	| 	 I dH  | dI dH \}}|d	kst
||	 kst
| d
|	 I dH  |dI dH }|d
kst
| d|	 I dH dks"t
td}tjtdd |j|ddI dH \}}W 5 Q R X ||I dH \}}|dks~t
|dkst
|| 	 kst
| d|	 I dH dkst
td}||I dH }|dkst
|dkst
tjdkrtjjdkrtj}	nd}	tjttd}
|dI dH  W 5 Q R X |
jjtjksVt
tjtdd |d|	I dH  W 5 Q R X tjtdd |d|	| 	 I dH  W 5 Q R X tjtdd  |d|	| 	 dI dH  W 5 Q R X dS )z!Test all recv methods for codecovr   zcode will most likely hangr   r   Nr   r   r   r   s   defs   ghi   z^partial recvfrom_into$   )nbytess
   ghi          jkls
   jkl       r   cpython      mnoz"^FakeNet send flags must be 0, notzwrong number of arguments$z	extra arg)r   r   r   r   r   r   NotImplementedErrorrecvr   r   r   r    r!   	bytearrayrecvfrom_into	recv_intosysplatformimplementationnameMSG_MOREr   ENOTCONN_MSGsendr   r   ENOTCONN	TypeError)r"   r#   r$   r%   r'   r(   bufr-   buf2flagsr&   r	   r	   r
   test_recv_methodsF   sR     " "rC   win32z"functions not in socket on windows)reasonc               	      s\  t jdkrXt  tjjtjjd} tjjtjjd}|dI d H  tjt	t
d}|dgI d H  W 5 Q R X |jjtjkst| dgdd| I d H d	kst|d
I d H \}}}}|dkst|g kst|dkst||  kst| d| I d H dksttd}td	}|||gI d H }	|	\}
}}}|
dksRt|dks`t|dksnt|g ks|t|dkst||  kst| d| I d H dksttd}||gI d H }	|	\}
}}}|
dkst|dkst|g kst|tjkst||  ks.ttjtdd | dI d H  W 5 Q R X d S )NrD   r   r   r   r1   r.   r	   r   r+   r   s   xyzw   r,   s   xys   zw s   xyzwv   z.^'FakeSocket' object has no attribute 'share'$)r7   r8   r   r   r   r   r   r   r   r   r<   sendmsgr   r   r>   r   r   recvmsgr    r4   recvmsg_into	MSG_TRUNCAttributeErrorshare)r"   r#   r&   r'   ZancdataZ	msg_flagsr(   Zbuf1rA   retr-   r	   r	   r
   test_nonwindows_functionality   sN    $  rO   z#windows-specific fakesocket testingc               	      s   t jdkrt  tjjtjjd} tjjtjjd}| dI d H  tjt	dd" | 
dgdd| I d H  W 5 Q R X tjt	d	d |d W 5 Q R X tjt	d
d |g  W 5 Q R X tt | d W 5 Q R X d S )NrD   r   r   z0^'FakeSocket' object has no attribute 'sendmsg'$r   r.   r	   r   z0^'FakeSocket' object has no attribute 'recvmsg'$z5^'FakeSocket' object has no attribute 'recvmsg_into'$)r7   r8   r   r   r   r   r   r   r   rL   rH   r   rI   rJ   r2   rM   )r"   r#   r	   r	   r
   test_windows_functionality   s,    
&rP   c                	      s*   t   tt tj  W 5 Q R X d S r   )r   r   r   r2   r   r   r	   r	   r	   r
   test_basic_tcp   s    rQ   c               	      s  t   tjjtjjd} tjtdd | tjtj	 W 5 Q R X tjt
dd | tjtjd W 5 Q R X tjtdd | tjtjd W 5 Q R X tjtdd | tjtjd W 5 Q R X | d tjt
d	d | d W 5 Q R X |  rtd S )
Nr   z0^FakeNet doesn't implement getsockopt\(\d, \d\)$r   z%^FakeNet always has IPV6_V6ONLY=True$Fz:^FakeNet doesn't implement setsockopt\(\d+, \d+, \.\.\.\)$Tr0   z(^FakeNet can't make inheritable sockets$)r   r   r   r   r   r   r   
getsockoptIPPROTO_TCPTCP_NODELAYr2   
setsockoptIPPROTO_IPV6IPV6_V6ONLY
SOL_SOCKETSO_REUSEADDRset_inheritableget_inheritabler   )r"   r	   r	   r
   test_not_implemented_functions   s:    
r\   c               	      s   t   tjjtjjd} tjttd}|   W 5 Q R X |j	j
t
jksLt| dI d H  tjtdd |   W 5 Q R X d S )Nr   r   r   zI^This method seems to assume that self._binding has a remote UDPEndpoint$)r   r   r   r   r   r   r   r<   getpeernamer   r   r>   r   r   )r"   r&   r	   r	   r
   test_getpeername  s    r^   c               	      s   t   tjttdtjj d tj } W 5 Q R X tjjtjj	d} | 
 dks\t| dI d H  | 
 \}}|dkst|dksttjjtjtj	d}|
 dkst|dI d H  |
 ^}}}|d	kst|dkst|ddgkstd S )
Nz#FakeNet doesn't (yet) support type=r   r   )z0.0.0.0r   r   r   )familyr   )z::r   z::1)r   r   r   r2   reescaper   r   SOCK_STREAMr   r   r   r   AF_INET6)r"   r$   r%   r#   _r	   r	   r
   	test_init  s*    re   )r   r`   r   r7   r   r   Ztrio.testing._fake_netr   r8   r<   r   r)   r*   rC   markZskipifrO   rP   rQ   r\   r^   re   r	   r	   r	   r
   <module>   s:   

#	A5(