o
    ACe?                     @  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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rWd 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Z!d0ddZ"d0ddZ#d1ddZ$d2d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.Z/eG d*d+ d+Z0eG d,d- d-ejj1ed.Z2dS )3    )annotationsN)TYPE_CHECKINGAnyIterableNoReturnTypeVarUnionoverload)NoPublicConstructorfinal)AddressFamily
SocketKind)TracebackType)BufferSelf	TypeAliasr   	IPAddressipreturnintc                 C  s0   t | tjr
tjjS t | tjrtjjS td)Nz!Unhandled IPAddress instance type)	
isinstance	ipaddressIPv4AddresstriosocketAF_INETIPv6AddressAF_INET6NotImplementedError)r    r   :usr/lib/python3.10/site-packages/trio/testing/_fake_net.py_family_for(   s
   r!   familyc                 C  4   | t jjkrtdS | t jjkrtdS td)N0.0.0.0::Unhandled ip address familyr   r   r   r   
ip_addressr   r   r"   r   r   r    _wildcard_ip_for0   
   

r*   c                 C  r#   )N	127.0.0.1::1r&   r'   r)   r   r   r    _localhost_ip_for8   r+   r.   coder   c                 C  s   t | t| N)OSErrorosstrerror)r/   r   r   r    	_fake_err@   s   r4   databytesbuffersIterable[Buffer]c              	   C  s~   d}|D ]8}| ||t |j  }t |}||d t|< W d    n1 s(w   Y  |t|7 }|t| kr< |S q|S )Nr   )
memoryviewnbyteslen)r5   r7   writtenbufZ
next_pieceZmbufr   r   r    _scatterD   s   
r>   T_UDPEndpointUDPEndpoint)boundc                   @  s6   e Zd ZU ded< ded< dddZedddZdS )r@   r   r   r   portr   +tuple[str, int] | tuple[str, int, int, int]c                 C  s(   | j j| jf}t| j tjr|d7 }|S )Nr   r   )r   
compressedrB   r   r   r   )selfsockaddrr   r   r    as_python_sockaddrX   s   zUDPEndpoint.as_python_sockaddrclstype[T_UDPEndpoint]rG   r?   c                 C  s"   |d d \}}| t ||dS )N   )r   rB   )r   r(   )rI   rG   r   rB   r   r   r    from_python_sockaddra   s   z UDPEndpoint.from_python_sockaddrNr   rC   )rI   rJ   rG   rC   r   r?   )__name__
__module____qualname____annotations__rH   classmethodrL   r   r   r   r    r@   S   s   
 
	c                   @  s   e Zd ZU ded< dS )
UDPBindingr@   localN)rN   rO   rP   rQ   r   r   r   r    rS   i   s   
 rS   c                   @  s@   e Zd ZU ded< ded< ejdd dZded< dd
dZdS )	UDPPacketr@   sourcedestinationc                 C  s   |   S r0   )hex)pr   r   r    <lambda>s   s    zUDPPacket.<lambda>)reprr6   payloadr   c                 C  s   t | j| j|dS )NrV   rW   r\   )rU   rW   rV   )rF   r\   r   r   r    replyu   s   
zUDPPacket.replyN)r\   r6   r   rU   )rN   rO   rP   rQ   attrZibr\   r^   r   r   r   r    rU   o   s
   
 rU   c                   @  s    e Zd ZU ded< dd	d
ZdS )FakeSocketFactoryFakeNetfake_netr"   r   typeprotor   
FakeSocketc                 C  s   t | j|||S r0   )re   _createrb   )rF   r"   rc   rd   r   r   r    r      s   zFakeSocketFactory.socketN)r"   r   rc   r   rd   r   r   re   )rN   rO   rP   rQ   r   r   r   r   r    r`   {   s   
 r`   c                   @  s4   e Zd ZU ded< 				ddddZdddZdS )FakeHostnameResolverra   rb   r   hostbytes | str | NonerB   bytes | str | int | Noner"   r   rc   rd   flagsr   ]list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int]]]c                   
   t dNzFakeNet doesn't do fake DNS yetr   )rF   rh   rB   r"   rc   rd   rk   r   r   r    getaddrinfo   s   z FakeHostnameResolver.getaddrinforG   rC   tuple[str, str]c                   rm   rn   ro   )rF   rG   rk   r   r   r    getnameinfo   s   z FakeHostnameResolver.getnameinfoN)r   r   r   r   )rh   ri   rB   rj   r"   r   rc   r   rd   r   rk   r   r   rl   )rG   rC   rk   r   r   rq   )rN   rO   rP   rQ   rp   rr   r   r   r   r    rg      s   
 rg   c                   @  s>   e Zd ZdddZdd	d
ZdddZdddZdddZdS )ra   r   Nonec                 C  s@   t d | _t d | _ttdd| _i | _d | _	d S )Nz	1.0.0.0/8z1::/16iP  i  )
r   ZIPv4NetworkZhostsZ_auto_ipv4_iterZIPv6Networkiterrange_auto_port_iter_boundroute_packetrF   r   r   r    __init__   s
   
zFakeNet.__init__bindingrS   r   re   c                 C  s"   || j v r
ttj || j |< d S r0   )rw   r4   errnoZ
EADDRINUSE)rF   r{   r   r   r   r    _bind   s   

zFakeNet._bindc                 C  s$   t jt|  t jt|  d S r0   )r   r   Zset_custom_socket_factoryr`   Zset_custom_hostname_resolverrg   ry   r   r   r    enable   s   zFakeNet.enablepacketrU   c                 C  s&   | j d u r| | d S |  | d S r0   )rx   deliver_packetrF   r   r   r   r    send_packet   s   
zFakeNet.send_packetc                 C  s0   t |jd}|| jv r| j| | d S 	 d S )NrT   )rS   rW   rw   _deliver_packet)rF   r   r{   r   r   r    r      s   
zFakeNet.deliver_packetNr   rs   )r{   rS   r   re   r   rs   r   rU   r   rs   )rN   rO   rP   rz   r}   r~   r   r   r   r   r   r    ra      s    




ra   c                   @  s  e Zd Zdzd	d
Zed{ddZed|ddZed}ddZd~ddZd~ddZ	dddZ
dd d!Zdd#d$Zdd'd(Zdd+d,Z	-	-ddd3d4Zdd6d7Zdd8d9Zedd<d=Zedd@d=Z	AdddDd=ZeddGdHZeddJdHZ	AdddLdHZddNdOZddVdWZdddZd[Zdd\d]Zddd_d`ZdddcddZdddfdgZ	-dddidjZ	-dddldmZd}dndoZd}dpdqZddrdsZ ddudvZ!ddxdyZ"dAS )re   rb   ra   r"   r   rc   r   rd   r   c                 C  s   || _ |s	tjj}|stjj}|tjjtjjfvr td| |tjjkr-t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_channelrU   float_packet_sender_packet_receiver_binding)rF   rb   r"   rc   rd   r   r   r    rz      s&   
zFakeSocket.__init__r   c                 C     | j S r0   )r   ry   r   r   r    rc         zFakeSocket.typec                 C  r   r0   )r   ry   r   r   r    r"      r   zFakeSocket.familyc                 C  r   r0   )r   ry   r   r   r    rd      r   zFakeSocket.protors   c                 C  s   | j r
ttj d S d S r0   )r   r4   r|   EBADFry   r   r   r    _check_closed   s   zFakeSocket._check_closedc                 C  s4   | j rd S d| _ | jd ur| jj| j= | j  d S )NT)r   r   r   rw   r   closery   r   r   r    r      s   
zFakeSocket.closeaddressobjectrT   booltuple[str, int]c                  s&   t jj| j| j| j|d|dI d H S )NF)r   Zipv6_v6onlyrT   )r   _socket_resolve_address_nocprc   r"   rd   )rF   r   rT   r   r   r    r      s   z FakeSocket._resolve_address_nocpr   rU   c                 C  s>   t tj | j| W d    d S 1 sw   Y  d S r0   )
contextlibsuppressr   ZBrokenResourceErrorr   Zsend_nowaitr   r   r   r    r     s   "zFakeSocket._deliver_packetaddrc                   s   |    | jd urttj tj I d H  | j|ddI d H \}}t	
|}t|| jks1J |t	
dkr>t	
d}n|t	
dkrJt	
d}|dkrTt| jj}tt||d}| j||  || _d S )NTr   r$   r,   r%   r-   r   )r   r   r4   r|   EINVALr   lowlevel
checkpointr   r   r(   r!   r"   nextr   rv   rS   r@   r}   )rF   r   Zip_strrB   r   r{   r   r   r    bind  s"   




zFakeSocket.bindpeerr   c                   rm   )Nz0FakeNet does not (yet) support connected socketsro   )rF   r   r   r   r    connect#  s   zFakeSocket.connectargsr   c           	        sD  |    g }d}d }t|dkr|\}n(t|dkr |\}}nt|dkr,|\}}}nt|dkr9|\}}}}ntdtj I d H  |d urS| j|ddI d H }|rYtd	|rbtd
| |d u rktt	j
 t|}| jd u r| t| jjdfI d H  d|}| jd usJ t| jj||d}| j| t|S )Nr      rK         wrong number of argumentsFr   &FakeNet doesn't support ancillary dataz"FakeNet send flags must be 0, not     r]   )r   r;   	TypeErrorr   r   r   r   r   r4   r|   ENOTCONNr@   rL   r   r   r*   r"   rE   joinrU   rT   r   r   )	rF   r   ancdatark   r   r7   rW   r\   r   r   r   r    sendmsg&  sF   




zFakeSocket.sendmsgr   r7   r8   
ancbufsizerk   2tuple[int, list[tuple[int, int, bytes]], int, Any]c           	        s~   |dkr	t d|dkrt d|   g }d}| j I d H }|j }t|j|}|t|jk r9|t	j
jO }||||fS )Nr   r   z&FakeNet doesn't support any recv flags)r   r   r   ZreceiverV   rH   r>   r\   r;   r   r   	MSG_TRUNC)	rF   r7   r   rk   r   	msg_flagsr   r   r<   r   r   r    recvmsg_intoX  s   
zFakeSocket.recvmsg_intorC   c                 C  sF   |    | jd ur| jj S | jtjjkrdS | jtjjks!J dS )N)r$   r   )r%   r   )	r   r   rT   rH   r"   r   r   r   r   ry   r   r   r    getsocknames  s   
zFakeSocket.getsocknamec                 C  sb   |    | jd ur*t| jdsJ d| jjd ur*t| jjts$J 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@   rH   r4   r|   r   ry   r   r   r    getpeername~  s   
zFakeSocket.getpeernameleveloptnamec                C     d S r0   r   )rF   r   r   r   r   r    
getsockopt     zFakeSocket.getsockoptbuflenr6   c                C  r   r0   r   rF   r   r   r   r   r   r    r     r   N
int | Noneint | bytesc                C  s   |    td| d| d)Nz%FakeNet doesn't implement getsockopt(, ))r   r1   r   r   r   r    r     s   valueint | Bufferc                C  r   r0   r   )rF   r   r   r   r   r   r    
setsockopt  r   zFakeSocket.setsockoptoptlenc                C  r   r0   r   rF   r   r   r   r   r   r   r    r     r   int | Buffer | Nonec                C  sB   |    ||ftjjtjjfkr|stdtd| d| d)Nz#FakeNet always has IPV6_V6ONLY=Truez%FakeNet doesn't implement setsockopt(r   z, ...))r   r   r   IPPROTO_IPV6IPV6_V6ONLYr   r1   r   r   r   r    r     s   r   c                 C  s   | S r0   r   ry   r   r   r    	__enter__     zFakeSocket.__enter__exc_type#builtins.type[BaseException] | None	exc_valueBaseException | None	tracebackTracebackType | Nonec                 C  s   |    d S r0   )r   )rF   r   r   r   r   r   r    __exit__  s   zFakeSocket.__exit__r5   r   c                   s   |  ||d I d H S r0   )sendto)rF   r5   rk   r   r   r    send  s   zFakeSocket.sendc                   sT   t |dkr|\}}d}nt |dkr|\}}}ntd| |gg ||I d H S )NrK   r   r   r   )r;   r   r   )rF   r   r5   r   rk   r   r   r    r     s   zFakeSocket.sendtobufsizec                   s   |  ||I d H \}}|S r0   )recvfrom)rF   r   rk   r5   r   r   r   r    recv  s   zFakeSocket.recvr=   r:   c                   s   |  |||I d H \}}|S r0   )recvfrom_into)rF   r=   r:   rk   Z	got_bytesr   r   r   r    	recv_into  s   zFakeSocket.recv_intotuple[bytes, Any]c                   s$   |  ||I d H \}}}}||fS r0   )recvmsg)rF   r   rk   r5   r   r   r   r   r   r    r     s   zFakeSocket.recvfromtuple[int, Any]c                   sF   |dkr|t |jkrtd| |gd|I d H \}}}}||fS )Nr   zpartial recvfrom_into)r9   r:   r   r   )rF   r=   r:   rk   
got_nbytesr   r   r   r   r   r    r     s   zFakeSocket.recvfrom_into4tuple[bytes, list[tuple[int, int, bytes]], int, Any]c           	        s@   t |}| |g||I d H \}}}}t|d | |||fS r0   )	bytearrayr   r6   )	rF   r   r   rk   r=   r   r   r   r   r   r   r    r     s   zFakeSocket.recvmsgc                 C     t d)Nz&can't get fileno() for FakeNet socketsro   ry   r   r   r    fileno     zFakeSocket.filenoc                 C  r   )Nzcan't detach() a FakeNet socketro   ry   r   r   r    detach  r   zFakeSocket.detachc                 C  s   dS )NFr   ry   r   r   r    get_inheritable  r   zFakeSocket.get_inheritableinheritablec                 C  s   |rt dd S )Nz&FakeNet can't make inheritable socketsro   )rF   r   r   r   r    set_inheritable  s   zFakeSocket.set_inheritable
process_idc                 C  r   )NzFakeNet can't share socketsro   )rF   r   r   r   r    share  r   zFakeSocket.share)rb   ra   r"   r   rc   r   rd   r   )r   r   )r   r   )r   r   r   )r   r   rT   r   r   r   r   )r   r   r   rs   )r   r   r   r   )r   r   r   r   rD   )r7   r8   r   r   rk   r   r   r   rM   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r6   r0   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   rs   )
r   r   r   r   r   rs   r   r   r   rs   )
r   r   r   r   r   r   r   r   r   rs   )r   r   )r   r   r   r   r   r   r   rs   )r   )r5   r   rk   r   r   r   )r   r   rk   r   r   r6   )r=   r   r:   r   rk   r   r   r   )r   r   rk   r   r   r   )r=   r   r:   r   rk   r   r   r   )r   r   r   r   rk   r   r   r   )r   r   )r   r   r   rs   )r   r   r   r6   )#rN   rO   rP   rz   propertyrc   r"   rd   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    re      s`    



	

	

5

	




	


re   )	metaclass)r   r   r   r   )r"   r   r   r   )r/   r   r   r   )r5   r6   r7   r8   r   r   )3
__future__r   builtinsr   r|   r   r2   typingr   r   r   r   r   r   r	   r_   r   Z
trio._utilr
   r   r   r   r   typesr   typing_extensionsr   r   r   r   r   r   rQ   r!   r*   r.   r4   r>   r?   frozenr@   rS   rU   abcZSocketFactoryr`   ZHostnameResolverrg   ra   
SocketTypere   r   r   r   r    <module>   sF   $





#