a
    (ñ»j’G  ã                   @  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	rÎd 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mZ d d	l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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-j0ƒƒZ1eG d(d)„ d)ƒƒZ2eG d*d+„ d+ejj3ed,�ƒZ4dS )-é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚNoReturnÚUnionÚoverload)ÚNoPublicConstructorÚfinal)ÚIterable)ÚAddressFamilyÚ
SocketKind)ÚTracebackType)ÚBufferÚSelfÚ	TypeAlias)ÚAddressFormatr   Ú	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   ú<E:\soccer\ml_env\Lib\site-packages\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_for3   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_errD   s    r2   ÚbytesúIterable[Buffer])ÚdataÚbuffersr   c              	   C  s|   d}|D ]n}| ||t |ƒj … }t |ƒ� }||d t|ƒ…< W d   ƒ n1 sP0    Y  |t|ƒ7 }|t| ƒkr qxq|S )Nr   )Ú
memoryviewÚnbytesÚlen)r5   r6   ÚwrittenÚbufZ
next_pieceZmbufr   r   r    Ú_scatterH   s    
.r<   c                   @  s@   e Zd ZU ded< ded< ddœdd„Zedd d	œd
d„ƒZdS )ÚUDPEndpointr   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_sockaddrY   s    þzUDPEndpoint.as_python_sockaddr)rC   r   c                 C  s"   |d d… \}}| t  |¡|d�S )Né   )r   r>   )r   r'   )ÚclsrC   r   r>   r   r   r    Úfrom_python_sockaddrb   s    z UDPEndpoint.from_python_sockaddrN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__rD   ÚclassmethodrG   r   r   r   r    r=   T   s
   
	r=   c                   @  s   e Zd ZU ded< dS )Ú
UDPBindingr=   ÚlocalN)rH   rI   rJ   rK   r   r   r   r    rM   k   s   
rM   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>u   ó    zUDPPacket.<lambda>)Úreprr3   Úpayload)rW   r   c                 C  s   t | j| j|d�S )N©rP   rQ   rW   )rO   rQ   rP   )rB   rW   r   r   r    Úreplyx   s
    ýzUDPPacket.replyN)rH   rI   rJ   rK   ÚattrsÚfieldrW   rY   r   r   r   r    rO   q   s   
rO   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.   )r_   Ú_creater^   )rB   r"   r`   ra   r   r   r    r   „   s    zFakeSocketFactory.socketN)rH   rI   rJ   rK   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   zqlist[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes]]])Úhostr>   r"   Útypera   Úflagsr   c                 Ã  s   t dƒ‚d S ©NzFakeNet doesn't do fake DNS yet©r   )rB   rd   r>   r"   re   ra   rf   r   r   r    ÚgetaddrinfoŒ   s    z FakeHostnameResolver.getaddrinfor?   ztuple[str, str])rC   rf   r   c                 Ã  s   t dƒ‚d S rg   rh   )rB   rC   rf   r   r   r    ÚgetnameinfoŸ   s    z FakeHostnameResolver.getnameinfoN)r   r   r   r   )rH   rI   rJ   rK   ri   rj   r   r   r   r    rc   ˆ   s   
    ùrc   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]   ÚNoner@   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©rB   r   r   r    Ú__init__©   s
    zFakeNet.__init__rM   r_   )Úbindingr   r   c                 C  s"   || j v rttjƒ || j |< d S r.   )rr   r2   ÚerrnoZ
EADDRINUSE)rB   rv   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_resolverrc   rt   r   r   r    Úenable¸   s    zFakeNet.enablerO   ©Úpacketr   c                 C  s$   | j d u r|  |¡ n
|   |¡ d S r.   )rs   Údeliver_packet©rB   r{   r   r   r    Úsend_packet¼   s    
zFakeNet.send_packetc                 C  s,   t |jd�}|| jv r(| j|  |¡ n d S )N©rN   )rM   rQ   rr   Ú_deliver_packet)rB   r{   rv   r   r   r    r|   Â   s    
zFakeNet.deliver_packetN)rH   rI   rJ   ru   rx   ry   r~   r|   r   r   r   r    r]   §   s
   
r]   c                   @  s<  e Zd Zd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säesèeejd/ƒrèe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d€ddd?d@d=œdAd;„ZedddBddCœdDdE„ƒZeddddddFœdGdE„ƒZd�dddHd?ddFœdIdE„ZdJd	œdKdL„ZdMdNdOddPœdQdR„Zd‚dSdddTœdUdV„ZedSdWddXœdYdZ„ƒZedSdd[dd\œd]dZ„ƒZd^dd_œd`dZ„Zdƒddd<daœdbdc„Z d„dSdddddœdedf„Z!d…dddgdaœdhdi„Z"d†dSdddjddœdkdl„Z#d‡ddddmdnœdodp„Z$ejd.k�sÊe�sÎeejd/ƒ�rÎe$Z%dd	œdqdr„Z&dd	œdsdt„Z'dd	œdudv„Z(dddwœdxdy„Z)ejd.k�s(e�s8eejdzƒ�r8dd<d{œd|d}„Z*d'S )ˆr_   r]   r   r   r   rk   )r^   r"   re   ra   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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_channelrO   ÚfloatÚ_packet_senderÚ_packet_receiverÚ_binding)rB   r^   r"   re   ra   r   r   r    ru   Í   s&    ÿþzFakeSocket.__init__r@   c                 C  s   | j S r.   )r†   rt   r   r   r    re   í   s    zFakeSocket.typec                 C  s   | j S r.   )r…   rt   r   r   r    r"   ñ   s    zFakeSocket.familyc                 C  s   | j S r.   )r‡   rt   r   r   r    ra   õ   s    zFakeSocket.protoc                 C  s   | j rttjƒ d S r.   )rˆ   r2   rw   ÚEBADFrt   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‚   rr   r‹   Úclosert   r   r   r    r�   ý   s    
zFakeSocket.closeÚobjectÚboolztuple[str, int])ÚaddressrN   r   c                Ã  s$   t jj| j| j| j|d|d�I d H S )NF)r’   Zipv6_v6onlyrN   )r   Ú_socketÚ_resolve_address_nocpre   r"   ra   )rB   r’   rN   r   r   r    r”     s    úz FakeSocket._resolve_address_nocprO   rz   c                 C  s<   t  tj¡� | j |¡ W d   ƒ n1 s.0    Y  d S r.   )Ú
contextlibÚsuppressr   ZBrokenResourceErrorrŠ   Zsend_nowaitr}   r   r   r    r€     s    zFakeSocket._deliver_packet)Úaddrr   c                 Ã  sà   |   ¡  | jd urttjƒ tj ¡ I d H  | j|dd�I d H ^}}}|g ksVJ dƒ‚t	 
|¡}t|ƒ| jksrJ ‚|t	 
d¡krŒt	 
d¡}n|t	 
d¡kr¤t	 
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Œ   r2   rw   ÚEINVALr   ÚlowlevelÚ
checkpointr”   r   r'   r!   r"   Únextr‚   rq   rM   r=   rx   )rB   r—   Úip_strr>   Ú_r   rv   r   r   r    Úbind  s"    



zFakeSocket.bindr   )Úpeerr   c                 Ã  s   t dƒ‚d S )Nz0FakeNet does not (yet) support connected socketsrh   )rB   rŸ   r   r   r    Úconnect2  s    zFakeSocket.connectr   r   Nr4   z!Iterable[tuple[int, int, Buffer]]zAddressFormat | None)r6   Úancdatarf   r’   r   c                 Ã  sÒ   |   ¡  tj ¡ I d H  |d ur4| j|dd�I d H }|r@tdƒ‚|rRtd|› �ƒ‚|d u rdttjƒ t	 
|¡}| jd u r”|  t| jƒjdf¡I d H  d |¡}| jd us¬J ‚t| jj||d�}| j |¡ t|ƒS )NFr   ú&FakeNet doesn't support ancillary dataz"FakeNet send flags must be 0, not r   rU   rX   )rŽ   r   r™   rš   r”   r   r2   rw   ÚENOTCONNr=   rG   rŒ   rž   r)   r"   rA   ÚjoinrO   rN   r‚   r~   r9   )rB   r6   r¡   rf   r’   rQ   rW   r{   r   r   r    Ú_sendmsg5  s,    



ýzFakeSocket._sendmsgÚwin32ÚsendmsgzZtuple[int, list[tuple[int, int, bytes]], int, tuple[str, int] | tuple[str, int, int, int]])r6   Ú
ancbufsizerf   r   c           	      Ã  sŽ   |dkrt dƒ‚|dkr t dƒ‚| jd u 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 flagszªThe 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receiverP   rD   r<   rW   r9   r   r   Ú	MSG_TRUNC)	rB   r6   r¨   rf   r¡   Ú	msg_flagsr{   r’   r:   r   r   r    Ú_recvmsg_intoa  s"    
ÿ
zFakeSocket._recvmsg_intor?   c                 C  sJ   |   ¡  | jd ur| jj ¡ S | jtjjkr0dS | jtjjksBJ ‚dS d S )N)r#   r   )r$   r   )	rŽ   rŒ   rN   rD   r"   r   r   r   r   rt   r   r   r    ÚgetsocknameŽ  s    
zFakeSocket.getsocknamec                 C  sb   |   ¡  | jd urTt| jdƒs&J dƒ‚| jjd urTt| jjtƒsHJ 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=   rD   r2   rw   r£   rt   r   r   r    Úgetpeername™  s"    
þýþýzFakeSocket.getpeername)ÚlevelÚoptnamer   c                C  s   d S r.   r   )rB   r°   r±   r   r   r    Ú
getsockopt¨  s    zFakeSocket.getsockoptr3   )r°   r±   Úbuflenr   c                C  s   d S r.   r   ©rB   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   )rB   r°   r±   r·   r   r   r    Ú
setsockopt¸  s    zFakeSocket.setsockopt)r°   r±   r·   Úoptlenr   c                C  s   d S r.   r   ©rB   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   rt   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�   )rB   r¾   r¿   rÀ   r   r   r    Ú__exit__Þ  s    zFakeSocket.__exit__r   )r5   rf   r   c                 Ã  s   |   ||d ¡I d H S r.   )Úsendto)rB   r5   rf   r   r   r    Úsendæ  s    zFakeSocket.sendz!tuple[object, ...] | str | Buffer)Ú_FakeSocket__dataÚ_FakeSocket__addressr   c                 Ã  s   d S r.   r   )rB   rÄ   rÅ   r   r   r    rÂ   ê  s    zFakeSocket.sendtoz(tuple[object, ...] | str | Buffer | None)rÄ   Ú_FakeSocket__flagsrÅ   r   c                 Ã  s   d S r.   r   )rB   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 )NrE   r   é   zwrong number of arguments)r9   Ú	TypeErrorr¥   )rB   rÇ   r5   r’   rf   r   r   r    rÂ   ú  s    )Úbufsizerf   r   c                 Ã  s   |   ||¡I d H \}}|S r.   )Úrecvfrom)rB   rÊ   rf   r5   Ú_addressr   r   r    Úrecv
  s    zFakeSocket.recv)r;   r8   rf   r   c                 Ã  s   |   |||¡I d H \}}|S r.   )Úrecvfrom_into)rB   r;   r8   rf   Z	got_bytesrÌ   r   r   r    Ú	recv_into  s    zFakeSocket.recv_intoztuple[bytes, AddressFormat]c                 Ã  s"   |   ||¡I d H \}}}}||fS r.   )Ú_recvmsg)rB   rÊ   rf   r5   Ú_ancdataÚ
_msg_flagsr’   r   r   r    rË     s    zFakeSocket.recvfromztuple[int, AddressFormat]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«   )rB   r;   r8   rf   Ú
got_nbytesrÑ   rÒ   r’   r   r   r    rÎ     s    ýzFakeSocket.recvfrom_intoz>tuple[bytes, list[tuple[int, int, bytes]], int, AddressFormat])rÊ   r¨   rf   r   c           	      Ã  s>   t |ƒ}|  |g||¡I d H \}}}}t|d |… ƒ|||fS r.   )Ú	bytearrayr«   r3   )	rB   rÊ   r¨   rf   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 socketsrh   rt   r   r   r    Úfileno<  s    zFakeSocket.filenoc                 C  s   t dƒ‚d S )Nzcan't detach() a FakeNet socketrh   rt   r   r   r    Údetach?  s    zFakeSocket.detachc                 C  s   dS )NFr   rt   r   r   r    Úget_inheritableB  s    zFakeSocket.get_inheritable)Úinheritabler   c                 C  s   |rt dƒ‚d S )Nz&FakeNet can't make inheritable socketsrh   )rB   rØ   r   r   r    Úset_inheritableE  s    zFakeSocket.set_inheritableÚshare)Ú
process_idr   c                 C  s   t dƒ‚d S )NzFakeNet can't share socketsrh   )rB   rÛ   r   r   r    rÚ   M  s    zFakeSocket.share)r   r   N)r   r   )N)N)r   )r   )r   r   )r   )r   r   )r   r   )+rH   rI   rJ   ru   Úpropertyre   r"   ra   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    r_   Ë   s     	   û'
ÿ
ÿ  ü$ÿ
ÿ û
 ú ý  ü  üÿ
ÿÿ
ÿr_   )Ú	metaclass)5Ú
__future__r   r•   rw   r   r0   r   rÝ   Útypingr   r   r   r   r   rZ   r   Z
trio._utilr   r	   ÚbuiltinsÚcollections.abcr
   r   r   Útypesr   Ztyping_extensionsr   r   r   Ztrio._socketr   r   r   r   rK   r!   r)   r,   r2   r<   Úfrozenr=   rM   rO   ÚabcZSocketFactoryr\   ZHostnameResolverrc   r]   Ú
SocketTyper_   r   r   r   r    Ú<module>	   sJ   	#