o
    dTilG                     @  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 d dlZd dlZd dlmZmZ e	red dlZd dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ ejej B Z!d
e"d< d/ddZ#d0ddZ$d0ddZ%d1ddZ&d2d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 )3    )annotationsN)TYPE_CHECKINGAnyNoReturn	TypeAliasoverload)NoPublicConstructorfinal)Iterable)AddressFamily
SocketKind)TracebackType)BufferSelf)AddressFormatr   	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   R/home/air/sos-pdf/back/venv/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_for-   
   

r)   c                 C  r"   )N	127.0.0.1::1r%   r&   r(   r   r   r   _localhost_ip_for6   r*   r-   coder   c                 C  s   t | t| N)OSErrorosstrerror)r.   r   r   r   	_fake_err>   s   r3   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)r4   r6   writtenbuf
next_piecembufr   r   r   _scatterB   s   
r?   c                   @  s6   e Zd ZU ded< ded< dddZedd
dZdS )UDPEndpointr   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   
compressedrA   r   r   r   )selfsockaddrr   r   r   as_python_sockaddrS   s   zUDPEndpoint.as_python_sockaddrrF   c                 C  s"   |d d \}}| t ||dS )N   )r   rA   )r   r'   )clsrF   r   rA   r   r   r   from_python_sockaddr\   s   z UDPEndpoint.from_python_sockaddrNr   rB   )rF   rB   r   r@   )__name__
__module____qualname____annotations__rG   classmethodrJ   r   r   r   r   r@   N   s   
 
	r@   c                   @  s   e Zd ZU ded< dS )
UDPBindingr@   localN)rL   rM   rN   rO   r   r   r   r   rQ   e   s   
 rQ   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 r/   )hex)pr   r   r   <lambda>o   s    zUDPPacket.<lambda>)reprr5   payloadr   c                 C  s   t | j| j|dS )NrT   rU   rZ   )rS   rU   rT   )rE   rZ   r   r   r   replyr   s
   zUDPPacket.replyN)rZ   r5   r   rS   )rL   rM   rN   rO   attrsfieldrZ   r\   r   r   r   r   rS   k   s
   
 rS   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 r/   )rd   _createra   )rE   r!   rb   rc   r   r   r   r   ~   s   zFakeSocketFactory.socketN)r!   r   rb   r   rc   r   r   rd   )rL   rM   rN   rO   r   r   r   r   r   r_   z   s   
 r_   c                   @  s4   e Zd ZU ded< 				ddddZdddZdS )FakeHostnameResolverr`   ra   r   hostbytes | NonerA   bytes | str | int | Noner!   r   typerc   flagsr   qlist[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes]]]c                   
   t dNzFakeNet doesn't do fake DNS yetr   )rE   rg   rA   r!   rj   rc   rk   r   r   r   getaddrinfo   s   z FakeHostnameResolver.getaddrinforF   rB   tuple[str, str]c                   rm   rn   ro   )rE   rF   rk   r   r   r   getnameinfo   s   z FakeHostnameResolver.getnameinfoN)r   r   r   r   )rg   rh   rA   ri   r!   r   rj   r   rc   r   rk   r   r   rl   )rF   rB   rk   r   r   rq   )rL   rM   rN   rO   rp   rr   r   r   r   r   rf      s   
 rf   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 )r`   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   IPv4Networkhosts_auto_ipv4_iterIPv6Network_auto_ipv6_iteriterrange_auto_port_iter_boundroute_packetrE   r   r   r   __init__   s
   
zFakeNet.__init__bindingrQ   r   rd   c                 C  s"   || j v r
ttj || j |< d S r/   )r|   r3   errno
EADDRINUSE)rE   r   r   r   r   r   _bind   s   

zFakeNet._bindc                 C  s$   t jt|  t jt|  d S r/   )r   r   set_custom_socket_factoryr_   set_custom_hostname_resolverrf   r~   r   r   r   enable   s   zFakeNet.enablepacketrS   c                 C  s&   | j d u r| | d S |  | d S r/   )r}   deliver_packetrE   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rR   )rQ   rU   r|   _deliver_packet)rE   r   r   r   r   r   r      s   
zFakeNet.deliver_packetNr   rs   )r   rQ   r   rd   r   rs   r   rS   r   rs   )rL   rM   rN   r   r   r   r   r   r   r   r   r   r`      s    




r`   c                   @  sF  e Zd ZdddZedddZedddZedddZdddZdddZ	dddZ
dd d!Zdd#d$Zdd'd(Z	)	*	+ddd2d3Zejd4ksResTeejd5rTeZ	*	*ddd8d9Zejd4ksieskeejd5rkeZdd;d<Zdd=d>ZeddAdBZeddEdBZ	+dddHdBZeddKdLZeddNdLZ	+dddPdLZddRdSZddZd[Zddd^d_ZeddcddZeddgddZddjddZdddldmZ dddpdqZ!	*dddsdtZ"	*	*dddvdwZ#	*	*dddydzZ$ejd4kseseejd5re$Z%dd{d|Z&dd}d~Z'dddZ(dddZ)ejd4kseseejdr!dddZ*d+S d+S d+S )rd   ra   r`   r!   r   rj   r   rc   r   r   rs   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_closedopen_memory_channelrS   float_packet_sender_packet_receiver_binding)rE   ra   r!   rj   rc   r   r   r   r      s&   
zFakeSocket.__init__c                 C     | j S r/   )r   r~   r   r   r   rj         zFakeSocket.typec                 C  r   r/   )r   r~   r   r   r   r!      r   zFakeSocket.familyc                 C  r   r/   )r   r~   r   r   r   rc      r   zFakeSocket.protoc                 C  s   | j r
ttj d S d S r/   )r   r3   r   EBADFr~   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   r|   r   closer~   r   r   r   r      s   
zFakeSocket.closeaddressobjectrR   booltuple[str, int]c                  s&   t jj| j| j| j|d|dI d H S )NF)r   ipv6_v6onlyrR   )r   _socket_resolve_address_nocprj   r!   rc   )rE   r   rR   r   r   r   r      s   z FakeSocket._resolve_address_nocpr   rS   c                 C  s>   t tj | j| W d    d S 1 sw   Y  d S r/   )
contextlibsuppressr   BrokenResourceErrorr   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 ^}}}|g ks,J dt	
|}t|| jks:J |t	
dkrGt	
d}n|t	
dkrSt	
d}|dkr]t| jj}tt||d}| j||  || _d S )	NTr   zTODO: handle other values?r#   r+   r$   r,   r   )r   r   r3   r   EINVALr   lowlevel
checkpointr   r   r'   r    r!   nextr   r{   rQ   r@   r   )rE   r   ip_strrA   _r   r   r   r   r   bind  s$   




zFakeSocket.bindpeerr   c                   rm   )Nz0FakeNet does not (yet) support connected socketsro   )rE   r   r   r   r   connect,  s   zFakeSocket.connectr   r   Nr6   r7   ancdata!Iterable[tuple[int, int, Buffer]]rk   AddressFormat | Nonec                   s   |    tj I d H  |d ur| j|ddI d H }|r!td|r*td| |d u r3ttj t	
|}| jd u rK| t| jjdfI d H  d|}| jd usWJ t| jj||d}| j| t|S )NFr   &FakeNet doesn't support ancillary dataz"FakeNet send flags must be 0, not r       r[   )r   r   r   r   r   r   r3   r   ENOTCONNr@   rJ   r   r   r)   r!   rD   joinrS   rR   r   r   r:   )rE   r6   r   rk   r   rU   rZ   r   r   r   r   _sendmsg/  s.   



zFakeSocket._sendmsgwin32sendmsg
ancbufsizeZtuple[int, list[tuple[int, int, bytes]], int, tuple[str, int] | tuple[str, int, int, int]]c           	        s   |dkr	t d|dkrt d| jd u rt d|   g }d}| j I d H }|j }t|j|}|t	|jk rB|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   receiverT   rG   r?   rZ   r:   r   r   	MSG_TRUNC)	rE   r6   r   rk   r   	msg_flagsr   r   r;   r   r   r   _recvmsg_into[  s$   

zFakeSocket._recvmsg_intorB   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   rR   rG   r!   r   r   r   r   r~   r   r   r   getsockname  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@   rG   r3   r   r   r~   r   r   r   getpeername  s"   
zFakeSocket.getpeernameleveloptnamec                C     d S r/   r   )rE   r   r   r   r   r   
getsockopt     zFakeSocket.getsockoptbuflenr5   c                C  r   r/   r   rE   r   r   r   r   r   r   r     r   
int | Noneint | bytesc                C  s   |    td| d| d)Nz%FakeNet doesn't implement getsockopt(, ))r   r0   r   r   r   r   r     s   valueint | Bufferc                C  r   r/   r   )rE   r   r   r   r   r   r   
setsockopt  r   zFakeSocket.setsockoptoptlenc                C  r   r/   r   rE   r   r   r   r   r   r   r   r     s   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   r0   r   r   r   r   r     s   r   c                 C  s   | S r/   r   r~   r   r   r   	__enter__  r   zFakeSocket.__enter__exc_type#builtins.type[BaseException] | None	exc_valueBaseException | None	tracebackTracebackType | Nonec                 C  s   |    d S r/   )r   )rE   r   r   r   r   r   r   __exit__  s   zFakeSocket.__exit__r4   r   c                   s   |  ||d I d H S r/   )sendto)rE   r4   rk   r   r   r   send  s   zFakeSocket.send_FakeSocket__data_FakeSocket__address!tuple[object, ...] | str | Bufferc                      d S r/   r   )rE   r   r   r   r   r   r     s   zFakeSocket.sendto_FakeSocket__flags(tuple[object, ...] | str | Buffer | Nonec                   r   r/   r   )rE   r   r   r   r   r   r   r     s   argsr   c                   sT   t |dkr|\}}d}nt |dkr|\}}}ntd| |gg ||I d H S )NrH   r      zwrong number of arguments)r:   	TypeErrorr   )rE   r   r4   r   rk   r   r   r   r     s   bufsizec                   s   |  ||I d H \}}|S r/   )recvfrom)rE   r   rk   r4   _addressr   r   r   recv  s   zFakeSocket.recvr<   r9   c                   s   |  |||I d H \}}|S r/   )recvfrom_into)rE   r<   r9   rk   	got_bytesr   r   r   r   	recv_into  s   zFakeSocket.recv_intotuple[bytes, AddressFormat]c                   s$   |  ||I d H \}}}}||fS r/   )_recvmsg)rE   r   rk   r4   _ancdata
_msg_flagsr   r   r   r   r     s   zFakeSocket.recvfromtuple[int, AddressFormat]c                   sF   |dkr|t |jkrtd| |gd|I d H \}}}}||fS )Nr   zpartial recvfrom_into)r8   r9   r   r   )rE   r<   r9   rk   
got_nbytesr   r   r   r   r   r   r     s   zFakeSocket.recvfrom_into>tuple[bytes, list[tuple[int, int, bytes]], int, AddressFormat]c           	        s@   t |}| |g||I d H \}}}}t|d | |||fS r/   )	bytearrayr   r5   )	rE   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   r~   r   r   r   fileno6     zFakeSocket.filenoc                 C  r   )Nzcan't detach() a FakeNet socketro   r~   r   r   r   detach9  r  zFakeSocket.detachc                 C  s   dS )NFr   r~   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   )rE   r  r   r   r   set_inheritable?  s   zFakeSocket.set_inheritableshare
process_idc                 C  r   )NzFakeNet can't share socketsro   )rE   r  r   r   r   r  G  r  zFakeSocket.share)
ra   r`   r!   r   rj   r   rc   r   r   rs   )r   r   )r   r   )r   r   r   )r   r   rR   r   r   r   r   )r   r   r   rs   )r   r   r   r   )r   r   N)
r6   r7   r   r   rk   r   r   r   r   r   rC   )r6   r7   r   r   rk   r   r   r   rK   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r5   r/   )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   )r4   r   rk   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   rk   r   r   r5   )r<   r   r9   r   rk   r   r   r   )r   r   rk   r   r   r   )r<   r   r9   r   rk   r   r   r   )r   r   r   r   rk   r   r   r   )r   r   )r  r   r   rs   )r  r   r   r5   )+rL   rM   rN   r   propertyrj   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   rd      s    
 




	

'

$













rd   )	metaclass)r   r   r   r   )r!   r   r   r   )r.   r   r   r   )r4   r5   r6   r7   r   r   )4
__future__r   r   r   r   r1   r   r	  typingr   r   r   r   r   r]   r   
trio._utilr   r	   builtinscollections.abcr
   r   r   typesr   typing_extensionsr   r   trio._socketr   r   r   r   rO   r    r)   r-   r3   r?   frozenr@   rQ   rS   abcSocketFactoryr_   HostnameResolverrf   r`   
SocketTyperd   r   r   r   r   <module>   sL   


	

#