U
    gF                     @  s  U d dl m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	m
Z
mZmZmZmZmZ d dlZd dlZd dlmZmZ e	rd dlZd dlmZmZ d dlmZ d dlmZmZmZ eejejf Z de!d	< d	d
dddZ"d
d	dddZ#d
d	dddZ$d
ddddZ%ddd
dddZ&edddZ'ej(G dd dZ)ej(G d d! d!Z*ej(G d"d# d#Z+ej(G d$d% d%ej,j-Z.ej(G d&d' d'ej,j/Z0eG d(d) d)Z1eG d*d+ d+ejj2ed,Z3dS )-    )annotationsN)TYPE_CHECKINGAnyIterableNoReturnTypeVarUnionoverload)NoPublicConstructorfinal)AddressFamily
SocketKind)TracebackType)BufferSelf	TypeAliasr   	IPAddressint)ipreturnc                 C  s4   t | tjrtjjS t | tjr(tjjS tdd S )Nz!Unhandled IPAddress instance type)	
isinstance	ipaddressIPv4AddresstriosocketAF_INETIPv6AddressAF_INET6NotImplementedError)r    r   :/tmp/pip-unpacked-wheel-ks04xdmi/trio/testing/_fake_net.py_family_for*   s
    r!   )familyr   c                 C  s8   | t jjkrtdS | t jjkr,tdS tdd S )N0.0.0.0::Unhandled ip address familyr   r   r   r   
ip_addressr   r   r"   r   r   r    _wildcard_ip_for2   s
    

r)   c                 C  s8   | t jjkrtdS | t jjkr,tdS tdd S )N	127.0.0.1::1r%   r&   r(   r   r   r    _localhost_ip_for;   s
    

r,   r   )coder   c                 C  s   t | t| d S N)OSErrorosstrerror)r-   r   r   r    	_fake_errC   s    r2   bytesIterable[Buffer])databuffersr   c              
   C  sh   d}|D ]Z}| ||t |j  }t |}||d t|< W 5 Q R X |t|7 }|t| kr qdq|S )Nr   )
memoryviewnbyteslen)r5   r6   writtenbufZ
next_pieceZmbufr   r   r    _scatterG   s    
r<   T_UDPEndpointUDPEndpoint)boundc                   @  sB   e Zd ZU ded< ded< ddddZed	dd
dddZdS )r>   r   r   r   port+tuple[str, int] | tuple[str, int, int, int]r   c                 C  s(   | j j| jf}t| j tjr$|d7 }|S )N)r   r   )r   
compressedr@   r   r   r   )selfsockaddrr   r   r    as_python_sockaddr[   s    zUDPEndpoint.as_python_sockaddrztype[T_UDPEndpoint]r=   )clsrE   r   c                 C  s"   |d d \}}| t ||dS )N   )r   r@   )r   r'   )rG   rE   r   r@   r   r   r    from_python_sockaddrd   s    z UDPEndpoint.from_python_sockaddrN)__name__
__module____qualname____annotations__rF   classmethodrI   r   r   r   r    r>   V   s
   
	c                   @  s   e Zd ZU ded< dS )
UDPBindingr>   localN)rJ   rK   rL   rM   r   r   r   r    rO   m   s   
rO   c                   @  sF   e Zd ZU ded< ded< ejdd dZded< dd d	d
dZdS )	UDPPacketr>   sourcedestinationc                 C  s   |   S r.   )hex)pr   r   r    <lambda>w       zUDPPacket.<lambda>)reprr3   payload)rY   r   c                 C  s   t | j| j|dS )NrR   rS   rY   )rQ   rS   rR   )rD   rY   r   r   r    replyz   s
    zUDPPacket.replyN)rJ   rK   rL   rM   attrsfieldrY   r[   r   r   r   r    rQ   s   s   
rQ   c                   @  s*   e Zd ZU ded< dddddddZdS )	FakeSocketFactoryFakeNetfake_netr   
FakeSocket)r"   type_protor   c                 C  s   t | j|||S r.   )ra   _creater`   )rD   r"   rb   rc   r   r   r    r      s    zFakeSocketFactory.socketN)rJ   rK   rL   rM   r   r   r   r   r    r^      s   
r^   c                	   @  sD   e Zd ZU ded< dddddddddd	d
ZddddddZdS )FakeHostnameResolverr_   r`   r   zbytes | Nonezbytes | str | int | Noner   z]list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int]]])hostr@   r"   typerc   flagsr   c                   s   t dd S NzFakeNet doesn't do fake DNS yetr   )rD   rf   r@   r"   rg   rc   rh   r   r   r    getaddrinfo   s    z FakeHostnameResolver.getaddrinforA   ztuple[str, str])rE   rh   r   c                   s   t dd S ri   rj   )rD   rE   rh   r   r   r    getnameinfo   s    z FakeHostnameResolver.getnameinfoN)r   r   r   r   )rJ   rK   rL   rM   rk   rl   r   r   r   r    re      s   
    re   c                   @  sZ   e Zd ZddddZdddddd	Zddd
dZdddddZdddddZdS )r_   NonerB   c                 C  s@   t d | _t d | _ttdd| _i | _	d | _
d S )Nz	1.0.0.0/8z1::/16iP  i  )r   IPv4NetworkhostsZ_auto_ipv4_iterIPv6NetworkZ_auto_ipv6_iteriterrange_auto_port_iter_boundroute_packetrD   r   r   r    __init__   s
    zFakeNet.__init__rO   ra   )bindingr   r   c                 C  s"   || j krttj || j |< d S r.   )rt   r2   errnoZ
EADDRINUSE)rD   rx   r   r   r   r    _bind   s    

zFakeNet._bindc                 C  s$   t jt|  t jt|  d S r.   )r   r   Zset_custom_socket_factoryr^   Zset_custom_hostname_resolverre   rv   r   r   r    enable   s    zFakeNet.enablerQ   packetr   c                 C  s$   | j d kr| | n
|  | d S r.   )ru   deliver_packetrD   r}   r   r   r    send_packet   s    
zFakeNet.send_packetc                 C  s,   t |jd}|| jkr(| j| | n d S )NrP   )rO   rS   rt   _deliver_packet)rD   r}   rx   r   r   r    r~      s    
zFakeNet.deliver_packetN)rJ   rK   rL   rw   rz   r{   r   r~   r   r   r   r    r_      s
   
r_   c                   @  s:  e Zd ZdddddddZeddd	d
ZeddddZeddddZddddZddddZ	ddddddZ
dddddZddddd Zdd!d"d#d$Zd~d(d)dd*dd+d,d-Zejd.kseseejd/reZdd(ddd0d1d2d3Zejd.kses eejd/r eZd4dd5d6Zd4dd7d8Zedddd9d:d;Zedddd<d=d>d;Zdddd?d@d=dAd;ZedddBddCdDdEZeddddddFdGdEZddddHd?ddFdIdEZdJddKdLZdMdNdOddPdQdRZddSdddTdUdVZedSdWddXdYdZZedSdd[dd\d]dZZd^dd_d`dZZdddd<dadbdcZ ddSddddddedfZ!ddddgdadhdiZ"ddSdddjdddkdlZ#dddddmdndodpZ$ejd.kseseejd/re$Z%dddqdrZ&dddsdtZ'dddudvZ(dddwdxdyZ)ejd.ks&es6eejdzr6dd<d{d|d}Z*d'S )ra   r_   r   r   r   )r`   r"   rg   rc   c                 C  s   || _ |stjj}|stjj}|tjjtjjfkr@td| |tjjkrZtd| || _|| _	|| _
d| _tjt td\| _| _d | _d S )Nz%FakeNet doesn't (yet) support family=z#FakeNet doesn't (yet) support type=Finf)	_fake_netr   r   r   SOCK_STREAMr   r   
SOCK_DGRAM_family_type_proto_closedZopen_memory_channelrQ   float_packet_sender_packet_receiver_binding)rD   r`   r"   rg   rc   r   r   r    rw      s&    zFakeSocket.__init__rB   c                 C  s   | j S r.   )r   rv   r   r   r    rg      s    zFakeSocket.typec                 C  s   | j S r.   )r   rv   r   r   r    r"      s    zFakeSocket.familyc                 C  s   | j S r.   )r   rv   r   r   r    rc      s    zFakeSocket.protorm   c                 C  s   | j rttj d S r.   )r   r2   ry   EBADFrv   r   r   r    _check_closed   s    zFakeSocket._check_closedc                 C  s4   | j r
d S d| _ | jd k	r&| jj| j= | j  d S )NT)r   r   r   rt   r   closerv   r   r   r    r      s    
zFakeSocket.closeobjectboolztuple[str, int])addressrP   r   c                  s$   t jj| j| j| j|d|dI d H S )NF)r   Zipv6_v6onlyrP   )r   _socket_resolve_address_nocprg   r"   rc   )rD   r   rP   r   r   r    r     s    z FakeSocket._resolve_address_nocprQ   r|   c              	   C  s(   t tj | j| W 5 Q R X d S r.   )
contextlibsuppressr   ZBrokenResourceErrorr   Zsend_nowaitr   r   r   r    r     s    zFakeSocket._deliver_packet)addrr   c                   s   |    | jd k	rttj tj I d H  | j|ddI d H ^}}}|g ksVt	dt
|}t|| jksrt	|t
dkrt
d}n|t
dkrt
d}|dkrt| jj}tt||d}| j||  || _d S )	NTr   zTODO: handle other values?r#   r*   r$   r+   r   )r   r   r2   ry   EINVALr   lowlevel
checkpointr   AssertionErrorr   r'   r!   r"   nextr   rs   rO   r>   rz   )rD   r   ip_strr@   _r   rx   r   r   r    bind  s"    



zFakeSocket.bindr   )peerr   c                   s   t dd S )Nz0FakeNet does not (yet) support connected socketsrj   )rD   r   r   r   r    connect4  s    zFakeSocket.connectr   r   Nr4   z!Iterable[tuple[int, int, Buffer]]z
Any | None)r6   ancdatarh   r   r   c                   s   |    tj I d H  |d k	r4| j|ddI d H }|r@td|rRtd| |d krdttj t	
|}| jd kr| t| jjdfI d H  d|}| jd k	stt| jj||d}| j| t|S )NFr   &FakeNet doesn't support ancillary dataz"FakeNet send flags must be 0, not r   rW   rZ   )r   r   r   r   r   r   r2   ry   ENOTCONNr>   rI   r   r   r)   r"   rC   joinr   rQ   rP   r   r   r9   )rD   r6   r   rh   r   rS   rY   r}   r   r   r    _sendmsg7  s,    



zFakeSocket._sendmsgwin32sendmsgz2tuple[int, list[tuple[int, int, bytes]], int, Any])r6   
ancbufsizerh   r   c           	        s   |dkrt d|dkr t d| jd kr2t d|   g }d}| j I d H }|j }t|j|}|t	|jk r|t
jjO }||||fS )Nr   r   z&FakeNet doesn't support any recv flagszThe code will most likely hang if you try to receive on a fakesocket without a binding. If that is not the case, or you explicitly want to test that, remove this warning.)r   r   r   r   ZreceiverR   rF   r<   rY   r9   r   r   	MSG_TRUNC)	rD   r6   r   rh   r   	msg_flagsr}   r   r:   r   r   r    _recvmsg_intoc  s"    

zFakeSocket._recvmsg_intorA   c                 C  sJ   |    | jd k	r| jj S | jtjjkr0dS | jtjjksBt	dS d S )N)r#   r   )r$   r   )
r   r   rP   rF   r"   r   r   r   r   r   rv   r   r   r    getsockname  s    
zFakeSocket.getsocknamec                 C  sb   |    | jd k	rTt| jds&td| jjd k	rTt| jjtsHtd| jj S tt	j
 d S )NremotezGThis method seems to assume that self._binding has a remote UDPEndpointz,Self._binding.remote should be a UDPEndpoint)r   r   hasattrr   r   r   r>   rF   r2   ry   r   rv   r   r   r    getpeername  s"    
zFakeSocket.getpeername)leveloptnamer   c                C  s   d S r.   r   )rD   r   r   r   r   r    
getsockopt  s    zFakeSocket.getsockoptr3   )r   r   buflenr   c                C  s   d S r.   r   rD   r   r   r   r   r   r    r     s    z
int | Nonezint | bytesc                C  s"   |    td| d| dd S )Nz%FakeNet doesn't implement getsockopt(, ))r   r/   r   r   r   r    r     s    zint | Buffer)r   r   valuer   c                C  s   d S r.   r   )rD   r   r   r   r   r   r    
setsockopt  s    zFakeSocket.setsockopt)r   r   r   optlenr   c                C  s   d S r.   r   rD   r   r   r   r   r   r   r    r     s    zint | Buffer | Nonec                C  sF   |    ||ftjjtjjfkr,|s,tdtd| d| dd S )Nz#FakeNet always has IPV6_V6ONLY=Truez%FakeNet doesn't implement setsockopt(r   z, ...))r   r   r   IPPROTO_IPV6IPV6_V6ONLYr   r/   r   r   r   r    r     s    r   c                 C  s   | S r.   r   rv   r   r   r    	__enter__  s    zFakeSocket.__enter__z#builtins.type[BaseException] | NonezBaseException | NonezTracebackType | None)exc_type	exc_value	tracebackr   c                 C  s   |    d S r.   )r   )rD   r   r   r   r   r   r    __exit__  s    zFakeSocket.__exit__r   )r5   rh   r   c                   s   |  ||d I d H S r.   )sendto)rD   r5   rh   r   r   r    send  s    zFakeSocket.sendz!tuple[object, ...] | str | Buffer)_FakeSocket__data_FakeSocket__addressr   c                   s   d S r.   r   )rD   r   r   r   r   r    r     s    zFakeSocket.sendtoz(tuple[object, ...] | str | None | Buffer)r   _FakeSocket__flagsr   r   c                   s   d S r.   r   )rD   r   r   r   r   r   r    r     s    r   )argsr   c                   sR   t |dkr|\}}d}n t |dkr2|\}}}ntd| |gg ||I d H S )NrH   r      zwrong number of arguments)r9   	TypeErrorr   )rD   r   r5   r   rh   r   r   r    r     s    )bufsizerh   r   c                   s   |  ||I d H \}}|S r.   )recvfrom)rD   r   rh   r5   r   r   r   r    recv  s    zFakeSocket.recv)r;   r8   rh   r   c                   s   |  |||I d H \}}|S r.   )recvfrom_into)rD   r;   r8   rh   Z	got_bytesr   r   r   r    	recv_into  s    zFakeSocket.recv_intoztuple[bytes, Any]c                   s"   |  ||I d H \}}}}||fS r.   )_recvmsg)rD   r   rh   r5   r   r   r   r   r   r    r   
  s    zFakeSocket.recvfromztuple[int, Any]c                   sD   |dkr|t |jkrtd| |gd|I d H \}}}}||fS )Nr   zpartial recvfrom_into)r7   r8   r   r   )rD   r;   r8   rh   
got_nbytesr   r   r   r   r   r    r     s    zFakeSocket.recvfrom_intoz4tuple[bytes, list[tuple[int, int, bytes]], int, Any])r   r   rh   r   c           	        s>   t |}| |g||I d H \}}}}t|d | |||fS r.   )	bytearrayr   r3   )	rD   r   r   rh   r;   r   r   r   r   r   r   r    r     s    zFakeSocket._recvmsgc                 C  s   t dd S )Nz&can't get fileno() for FakeNet socketsrj   rv   r   r   r    fileno0  s    zFakeSocket.filenoc                 C  s   t dd S )Nzcan't detach() a FakeNet socketrj   rv   r   r   r    detach3  s    zFakeSocket.detachc                 C  s   dS )NFr   rv   r   r   r    get_inheritable6  s    zFakeSocket.get_inheritable)inheritabler   c                 C  s   |rt dd S )Nz&FakeNet can't make inheritable socketsrj   )rD   r   r   r   r    set_inheritable9  s    zFakeSocket.set_inheritableshare)
process_idr   c                 C  s   t dd S )NzFakeNet can't share socketsrj   )rD   r   r   r   r    r   A  s    zFakeSocket.share)r   r   N)r   r   )N)N)r   )r   )r   r   )r   )r   r   )r   r   )+rJ   rK   rL   rw   propertyrg   r"   rc   r   r   r   r   r   r   r   sysplatformr   r   r   r   r   recvmsg_intor   r   r	   r   r   r   r   r   r   r   r   r   r   r   recvmsgr   r   r   r   r   r   r   r   r    ra      s    	   '

  
 
     

ra   )	metaclass)4
__future__r   r   ry   r   r0   r   r   typingr   r   r   r   r   r   r	   r\   r   Z
trio._utilr
   r   builtinsr   r   typesr   Ztyping_extensionsr   r   r   r   r   r   rM   r!   r)   r,   r2   r<   r=   frozenr>   rO   rQ   abcZSocketFactoryr^   ZHostnameResolverre   r_   
SocketTypera   r   r   r   r    <module>	   sJ    $
	#